Защита объектов

Защита объектов

Технический фундамент защиты объектов

Методы защиты управляют структурной изменяемостью объекта: можно ли добавлять, удалять и менять свойства.

const obj = { a: 1 };
Object.preventExtensions(obj);

obj.b = 2; // не добавится
obj.a = 3; // изменится
console.log(obj); // { a: 3 }

Ключевой момент: preventExtensions, seal и freeze отличаются строгостью ограничений.

Object.preventExtensions

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

const settings = { theme: 'dark' };
Object.preventExtensions(settings);

settings.lang = 'ru'; // не добавится
settings.theme = 'light'; // можно

Object.seal

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

const user = { name: 'Ann' };
Object.seal(user);

user.name = 'Max'; // можно
// delete user.name; // нельзя
// user.age = 20; // нельзя

Object.freeze

Самая строгая защита: нельзя добавлять, удалять и менять значения свойств.

const config = { apiUrl: '/api', mode: 'prod' };
Object.freeze(config);

config.mode = 'dev'; // не изменится

Смотри, что важно: в строгом режиме ('use strict' / модули) попытка изменить/добавить/удалить запрещенное свойство часто приводит к TypeError. В нестрогом режиме такие операции могут «тихо» не сработать.

Проверь себя: какой метод выбрать, если нужно разрешить изменение текущих полей, но запретить добавление новых?

Проверка статуса

Object.isExtensible(settings);
Object.isSealed(user);
Object.isFrozen(config);

Важный edge case

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

const app = { options: { lang: 'ru' } };
Object.freeze(app);

app.options.lang = 'en'; // может измениться

Микро-сценарии

  1. Защитить APP_CONSTANTS от случайной мутации.
  2. Ограничить структуру объекта настроек в большом проекте.

Типичные ошибки

  • Ожидать deep-защиту вложенных объектов.
  • Применять freeze там, где данные должны обновляться.
  • Не проверять статус объекта после защиты.
  • Пытаться «обойти» ограничения через неочевидные места кода.

Краткий итог

  • preventExtensions запрещает добавлять новые поля.
  • seal запрещает добавлять и удалять.
  • freeze запрещает любые изменения существующих полей.
  • Эти методы полезны для стабильных конфигов и констант.
  • Для вложенных структур нужна отдельная стратегия глубокой защиты.