Дескрипторы свойств
Дескриптор свойства – это обычный 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
});