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 не выполняет. Успешное выполнение в одной среде не гарантирует поддержку метода во всех браузерах.