Object.seal(): запрет изменения набора свойств
Object.seal фиксирует набор собственных свойств объекта: новые нельзя добавить, существующие нельзя удалить или перенастроить. Запись в обычное изменяемое свойство при этом может оставаться разрешённой.
Назначение
Object.seal фиксирует набор собственных свойств объекта: новые нельзя добавить, существующие нельзя удалить или перенастроить. Запись в обычное изменяемое свойство при этом может оставаться разрешённой.
Как это работает
Операция меняет сам объект и возвращает ту же ссылку. В строгом режиме недопустимые присваивания и удаления вызывают исключения. Ограничение поверхностное: вложенные объекты не становятся запечатанными автоматически.
Пример
"use strict";
const settings = {theme: "light", nested: {count: 1}};
Object.seal(settings);
settings.theme = "dark";
settings.nested.count = 2;
console.assert(settings.theme === "dark");
console.assert(Object.isSealed(settings));
console.assert(!Object.isSealed(settings.nested));
let rejected = false;
try { delete settings.theme; } catch (error) { rejected = error instanceof TypeError; }
console.assert(rejected);
console.log(settings);
Что должно получиться
Название темы меняется, а удаление свойства завершается ошибкой. Вложенный объект остаётся самостоятельным изменяемым объектом. Пример показывает разницу между фиксированной структурой и неизменяемыми данными.
Граница применения и частая ошибка
Seal не равен freeze и не является границей безопасности для недоверенного кода. Нельзя ожидать, что запечатывание автоматически защитит состояние по всем вложенным ссылкам или запретит внутреннюю работу методов.
Самостоятельная проверка
Сравните обычный объект, запечатанный и замороженный. Для каждого попробуйте изменить значение, добавить ключ и удалить ключ. Выполняйте попытки отдельно с обработкой ошибок, чтобы одно исключение не прервало всю таблицу.
Пример JavaScript проверяйте в собственном учебном файле или консоли своего проекта. Встроенная песочница справочника JavaScript не выполняет. Успешное выполнение в одной среде не гарантирует поддержку метода во всех браузерах.