Object.freeze(): поверхностная неизменяемость объекта
Object.freeze запрещает обычные изменения собственных свойств объекта и расширение его новым набором свойств.
Назначение
Object.freeze запрещает обычные изменения собственных свойств объекта и расширение его новым набором свойств.
Как это работает
Замораживание поверхностное: вложенные объекты не становятся замороженными автоматически. Попытка запрещённой записи в строгом режиме вызывает ошибку, а в иных случаях может не дать эффекта без исключения.
Пример
const settings=Object.freeze({size:10,nested:{active:true}});
console.assert(Object.isFrozen(settings));
console.assert(!Object.isFrozen(settings.nested));
settings.nested.active=false;
console.assert(settings.nested.active===false);
Что должно получиться
Внешний объект заморожен, но его вложенная запись остаётся изменяемой. Такая граница полезна, только если разработчик явно понимает глубину сохраняемого состояния.
Граница применения и частая ошибка
Не считайте freeze контролем доступа к секретным данным или полной изоляцией состояния. Ссылки на вложенные объекты по-прежнему позволяют менять их, если они не защищены отдельно.
Самостоятельная проверка
Проверьте Object.isFrozen у внешнего и вложенного объектов. Затем измените вложенное поле и объясните, почему это не нарушает поверхностную гарантию.
JavaScript в песочнице этого сайта не выполняется. Перенесите пример в отдельный учебный файл. Сначала проверьте исходный результат, затем измените входные данные; ошибка проверки означает, что результат отличается от ожидаемого.