Как запретить изменение через дескриптор?
Объекты и прототипы
Изменение свойства запрещают через дескриптор `Object.defineProperty` с `writable: false` (нельзя переприсвоить) и `configurable: false` (нельзя удалить/переопределить дескриптор).
Дескрипторы свойств
Каждое свойство имеет дескриптор с флагами:
- writable — можно ли переприсваивать значение.
- enumerable — попадает ли в перебор (
for...in,Object.keys). - configurable — можно ли удалять/менять дескриптор.
Запрет изменения
const obj = {};
Object.defineProperty(obj, 'id', {
value: 123,
writable: false, // нельзя переприсвоить
configurable: false, // нельзя удалить/переопределить
enumerable: true,
});
obj.id = 456; // молча игнорируется (ошибка в strict mode)
obj.id; // 123 — не изменилось
delete obj.id; // не удалится (configurable: false)Только чтение (writable: false)
Object.defineProperty(obj, 'name', { value: 'Ann', writable: false });
obj.name = 'Bob'; // не изменитсяГеттер без сеттера
Другой способ «только для чтения»:
Object.defineProperty(obj, 'computed', {
get() { return this.a + this.b; }, // только чтение, нет set
});Дескриптор против Object.freeze
- Дескриптор — точечный контроль над одним свойством.
- Object.freeze — замораживает весь объект (все свойства нередактируемы).
Коротко для собеседования
Изменение свойства запрещают через Object.defineProperty с writable: false (нельзя переприсвоить значение) и configurable: false (нельзя удалить/переопределить дескриптор). Также «только чтение» даёт геттер без сеттера. Нарушение молча игнорируется (ошибка в strict). Для всего объекта — Object.freeze.