Дескрипторы в JavaScript — это объекты, которые описывают различные свойства свойства объекта, такие как его значение (value), возможность записи (writable), возможность перечисления (enumerable) и возможность конфигурации (configurable). Также есть дескрипторы с геттерами и сеттерами.
Существует два типа дескрипторов:
Дескрипторы данных: Содержат значение свойства.
value: Значение свойства. Может быть любым валидным типом данных.writable: Логическое значение. Если true, значение свойства можно изменить (obj.prop = newValue). По умолчанию false для accessor-свойств и true для data-свойств, созданных обычным присваиванием.enumerable: Логическое значение. Если true, свойство будет видно при итерации по свойствам объекта (например, в цикле for...in или при использовании Object.keys()). По умолчанию false для свойств, добавленных Object.defineProperty, и true для свойств, созданных обычным присваиванием.configurable: Логическое значение. Если true, характеристики дескриптора (кроме value и writable при их изменении с данными на аксессоры) можно изменять, а само свойство удалять. По умолчанию false для свойств, добавленных Object.defineProperty (кроме value), и true для свойств, созданных обычным присваиванием. Once configured as non-configurable, cannot be changed back. You can decrease writability from true to false, but not vice versa on a non-configurable getter/setter.Дескрипторы аксессоров: Определяют функции, которые будут вызываться при получении (getter) или установке (setter) значения свойства.
get: Функция, вызываемая при чтении свойства. Результат этой функции становится значением свойства. Не принимает аргументов.set: Функция, вызываемая при записи в свойство. Принимает одно аргумент — новое устанавливаемое значение.enumerable: Логическое значение (аналогично data-дескрипторам).configurable: Логическое значение (аналогично data-дескрипторам).Дескрипторы нельзя смешивать: у свойства либо есть value и writable, либо get и set.
Дескрипторы используются для управления свойствами объекта на более низком уровне, чем обычное присваивание, в частности через методы Object.defineProperty(), Object.defineProperties(), Object.getOwnPropertyDescriptor(), Object.getOwnPropertyDescriptors(), Object.create().
Пример создания свойства с дескриптором данных:
javascript
Пример создания свойства с дескриптором аксессоров:
javascript
Использование дескрипторов позволяет создавать иммутабельные свойства, свойства с ленивым вычислением, свойства с контролем доступа (геттеры/сеттеры) и более гибко управлять поведением объектов.