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

Разбери, можно ли запретить изменять объект: при каких условиях и какие ограничения.

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

Запретить изменение объекта можно, и есть несколько уровней: `Object.freeze` (полная заморозка), `Object.seal` (запрет структуры), `Object.preventExtensions` (запрет добавления). Все — поверхностные.

Уровни защиты

Object.preventExtensions

Запрещает добавлять новые свойства; менять и удалять существующие можно.

const o = Object.preventExtensions({ a: 1 });
o.b = 2;   // не добавится
o.a = 5;   // ок
delete o.a; // ок

Object.seal

Запрещает добавлять и удалять; менять значения существующих можно.

const o = Object.seal({ a: 1 });
o.a = 5;    // ок
o.b = 2;    // не добавится
delete o.a; // не удалится

Object.freeze

Запрещает всё: добавлять, удалять и изменять свойства.

const o = Object.freeze({ a: 1 });
o.a = 5; // не изменится

Ограничения

  • Все три поверхностные — вложенные объекты не защищены. Нужна рекурсивная deepFreeze.
  • В нестрогом режиме нарушения молча игнорируются; в strict — кидают TypeError.
  • Проверка: Object.isFrozen, isSealed, isExtensible.

const и freeze

const защищает только привязку переменной, а freeze — содержимое объекта. Их часто путают.

Коротко для собеседования

Да: preventExtensions (запрет добавления), seal (запрет добавления/удаления), freeze (полный запрет изменений). Все поверхностные — вложенность нужно замораживать рекурсивно. В strict-режиме нарушения кидают ошибку. const защищает ссылку, а не содержимое.

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