Дескрипторы свойств

Дескриптор свойства – это обычный JavaScript-объект, описывающий атрибуты и значение свойства.

Дескрипторы свойств, присутствующие в объектах, бывают двух основных типов: дескрипторы данных и дескрипторы доступа.

Дескриптор данных - это свойство, имеющее значение, которое может быть (а может и не быть) записываемым.

Дескриптор доступа - это свойство, описываемое парой функций - геттером и сеттером.

Дескриптор может быть только чем-то одним из этих двух типов. Он не может быть одновременно обоими.


И дескриптор данных, и дескриптор доступа являются объектами.
Они обладают следующими обязательными ключами:

configurable (конфигурируемое) - признак доступности для настройки (если true, то свойство можно удалять, а также менять его в дальнейшем при помощи новых вызовов defineProperty). Значение по умолчанию установлено в false (при простом присваивании значения объекту - true)

enumerable (перечисляемое) - признак доступности для перечисления (если true , то свойство просматривается в цикле for..in и методе Object.keys()). Значение по умолчанию установлено в false (при простом присваивании значения объекту - true)

Дескриптор данных также может содержать следующие дополнительные ключи:

value - значение свойства, по умолчанию undefined

writable (перезаписываемое) - признак доступности для записи (значение свойства можно менять, если true). Значение по умолчанию установлено в false (при простом присваивании значения объекту - true)

Дескриптор доступа также может содержать следующие дополнительные ключи:

get - функция, используемая как геттер свойства, либо undefined, если свойство не имеет геттера. Возвращаемое значение функции будет использоваться как значение свойства. Значение по умолчанию установлено в undefined.

set - функция, используемая как сеттер свойства, либо undefined, если свойство не имеет сеттера. Функция принимает единственным аргументом новое значение, присваиваемое свойству. Значение по умолчанию установлено в undefined.


Добавление свойств и значений по умолчанию

Важно понимать, как устанавливаются значения по умолчанию атрибутам свойств. Часто существует разница между простым назначением значения посредством точечной нотации и использованием методаObject.defineProperty(), что и показывает пример ниже.

var o = {};

o.a = 1;
// Эквивалентно записи:
Object.defineProperty(o, 'a', {
  value: 1,
  writable: true,
  configurable: true,
  enumerable: true
});


// С другой стороны,
Object.defineProperty(o, 'a', { value: 1 });

// эквивалентно записи:
Object.defineProperty(o, 'a', {
  value: 1,
  writable: false,
  configurable: false,
  enumerable: false
});

results matching ""

    No results matching ""