PassFront
  1. PassFront
  2. База знаний
  3. Объекты и прототипы

Как запретить изменение через дескриптор?

Объекты и прототипы

Изменение свойства запрещают через дескриптор `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.

Другие вопросы раздела