Защита объектов
Защита объектов
Технический фундамент защиты объектов
Методы защиты управляют структурной изменяемостью объекта: можно ли добавлять, удалять и менять свойства.
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'; // может измениться
Микро-сценарии
- Защитить
APP_CONSTANTSот случайной мутации. - Ограничить структуру объекта настроек в большом проекте.
Типичные ошибки
- Ожидать deep-защиту вложенных объектов.
- Применять
freezeтам, где данные должны обновляться. - Не проверять статус объекта после защиты.
- Пытаться «обойти» ограничения через неочевидные места кода.
Краткий итог
preventExtensionsзапрещает добавлять новые поля.sealзапрещает добавлять и удалять.freezeзапрещает любые изменения существующих полей.- Эти методы полезны для стабильных конфигов и констант.
- Для вложенных структур нужна отдельная стратегия глубокой защиты.