Что такое Object.defineProperty?
Метод Object.defineProperty в JavaScript представляет собой мощный инструмент низкоуровневого управления свойствами объектов, позволяющий точно настраивать их поведение. Он определяет новое свойство непосредственно на объекте или изменяет уже существующее, возвращая этот же объект. Главная особенность метода заключается в возможности использования дескрипторов — специальных объектов конфигурации, которые определяют скрытые характеристики свойства.
Существует два типа дескрипторов: дескрипторы данных и дескрипторы доступа. Дескриптор данных включает такие параметры, как value, определяющий значение свойства, и writable, который управляет возможностью изменения этого значения. Дескриптор доступа вместо value использует функции-аксессоры get и set для перехвата чтения и записи свойства, что удобно для вычислений «на лету» или валидации.
Важным аспектом работы метода является то, что по умолчанию все флаги управления (writable, enumerable, configurable) для новых свойств, созданных через Object.defineProperty, устанавливаются в значение false. Это означает, что свойство по умолчанию не будет перезаписываться, не будет участвовать в циклах вроде for...in и его нельзя будет удалить или изменить его дескрипторы в дальнейшем. Для проверки текущих настроек конкретного свойства можно использовать парный метод Object.getOwnPropertyDescriptor.
Практическое применение Object.defineProperty включает создание неизменяемых констант внутри объектов, скрытие служебных полей от итерации или создание динамических свойств, вычисляемых при каждом обращении. Например, вы можете определить свойство fullName, которое будет автоматически собираться из firstName и lastName при чтении, и разбивать строку обратно при записи.