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