JavaScript предоставляет три метода для ограничения изменяемости объектов, каждый с разным уровнем строгости.
Object.preventExtensions()Предотвращает добавление новых свойств к объекту.
Object.preventExtensions(obj);
obj.newProp = 'x'; // молча не выполняется (выбросит ошибку в strict mode)
Object.seal()Запечатывает объект, предотвращая добавление и удаление, но всё ещё позволяет обновлять значения.
Object.seal(obj);
obj.existingProp = 'new value'; // разрешено
delete obj.existingProp; // молча не выполняется
Object.freeze()Самый строгий вариант — делает объект полностью неизменяемым.
Object.freeze(obj);
obj.existingProp = 'new value'; // молча не выполняется (выбросит ошибку в strict mode)
Все три метода работают поверхностно — они влияют только на свойства верхнего уровня объекта. Вложенные объекты остаются изменяемыми, если только их явно не ограничить.
Object.freeze(obj);
obj.nested.value = 'changed'; // всё ещё работает!
Чтобы достичь глубокой неизменяемости, нужно рекурсивно применить Object.freeze() ко всем вложенным объектам.
| Операция | preventExtensions | seal | freeze |
|---|---|---|---|
| Добавить свойства | ❌ | ❌ | ❌ |
| Удалить свойства | ✅ | ❌ | ❌ |
| Изменить значения | ✅ | ✅ | ❌ |
Object.seal() позволяет тебе изменять значения существующих свойств, но предотвращает как добавление новых свойств, так и удаление существующих.
Новый — ещё не проверен сообществом
Вы