Вебсправочник
Справочник JavaScript

Object.defineProperty(): управление свойством через дескриптор

Object.defineProperty задаёт значение и характеристики свойства явно. Это нужно, когда обычного присваивания недостаточно и требуется управлять записью, перечислением или перенастройкой поля.

Назначение

Object.defineProperty задаёт значение и характеристики свойства явно. Это нужно, когда обычного присваивания недостаточно и требуется управлять записью, перечислением или перенастройкой поля.

Как это работает

Для нового свойства флаги writable, enumerable и configurable по умолчанию false. Если поле должно вести себя как обычное присваиваемое свойство, укажите необходимые флаги явно. Дескриптор значения нельзя смешивать с get или set.

Пример

const lesson = {};
Object.defineProperty(lesson, "id", {value:7, enumerable:true});
console.assert(lesson.id === 7);
console.assert(Object.keys(lesson).includes("id"));
console.assert(Reflect.set(lesson, "id", 8) === false);
console.assert(lesson.id === 7);
console.assert(Reflect.deleteProperty(lesson, "id") === false);
console.log(Object.getOwnPropertyDescriptor(lesson, "id"));

Что должно получиться

Id читается и перечисляется, но запись и удаление возвращают false через Reflect. Пример использует эти методы, чтобы явно проверить отказ независимо от строгого режима обычного присваивания.

Граница применения и частая ошибка

Неизменяемость одного свойства не делает весь объект глубоко неизменяемым. Если value содержит объект, его внутренние поля могут оставаться изменяемыми. Configurable:false ограничивает последующее переопределение и не должно включаться случайно для временных настроек.

Самостоятельная проверка

Создайте второе свойство с writable:true и configurable:true. Измените и удалите его, сравнив результаты. Затем задайте объект в value и проверьте разницу между заменой ссылки и изменением вложенного поля.

Пример JavaScript проверяйте в собственном учебном файле или консоли своего проекта. Встроенная песочница справочника JavaScript не выполняет. Успешное выполнение в одной среде не гарантирует поддержку метода во всех браузерах.

Самостоятельный учебный материал. Техническая документация: первоисточник по теме ↗. Если результат отличается, проверьте код и версию браузера.