Что такое Object.freeze и Object.seal в JavaScript?
Object.freeze и Object.seal
Оба метода ограничивают мутации объекта, но с разной степенью жёсткости.
Object.freeze
Object.freeze(obj) замораживает объект полностью:
- нельзя добавлять новые свойства
- нельзя удалять существующие свойства
- нельзя изменять значения существующих свойств
- нельзя изменять дескрипторы свойств (writable, configurable, enumerable)
Попытки изменить замороженный объект в строгом режиме ('use strict') выбрасывают TypeError. В нестрогом режиме изменения молча игнорируются.
Object.seal
Object.seal(obj) «запечатывает» объект:
- нельзя добавлять новые свойства
- нельзя удалять существующие свойства
- можно изменять значения существующих свойств (если они были
writable: true)
Проверка состояния
Для проверки состояния объекта используются:
Object.isFrozen(obj)— возвращаетtrue, если объект замороженObject.isSealed(obj)— возвращаетtrue, если объект запечатан
Важно: замороженный объект является одновременно и запечатанным, поэтому Object.isSealed вернёт true для замороженного объекта.
Поверхностность (shallow)
Оба метода работают поверхностно — они не затрагивают вложенные объекты. Если свойство объекта само является объектом, оно остаётся мутабельным.
const obj = Object.freeze({ nested: { value: 1 } });
obj.nested.value = 99; // Работает! Вложенный объект не заморожен
console.log(obj.nested.value); // 99
Для глубокой заморозки нужна рекурсивная функция.
Практическое применение
Object.freeze— константы конфигурации, неизменяемые перечисления (enum-подобные объекты), защита от случайных мутаций в библиотечном кодеObject.seal— объекты с фиксированной схемой, где структура должна быть стабильной, но значения могут обновляться
Что хочет услышать интервьюер
Кандидат чётко разграничивает freeze (полный запрет изменений) и seal (запрет только добавления/удаления свойств)
Упоминает, что оба метода работают поверхностно (shallow) и не замораживают вложенные объекты
Знает о разном поведении в строгом и нестрогом режимах (TypeError vs молчаливое игнорирование)
Знает методы проверки isFrozen и isSealed, а также что замороженный объект считается запечатанным
Понимает практические сценарии применения: конфигурации, enum-объекты, защита API
Пример: Object.freeze — полная заморозка
const config = Object.freeze({
apiUrl: 'https://api.example.com',
timeout: 5000,
});
config.apiUrl = 'https://other.com'; // Молча игнорируется (или TypeError в strict mode)
config.newProp = 'test'; // Молча игнорируется
delete config.timeout; // Молча игнорируется
console.log(config.apiUrl); // 'https://api.example.com'
console.log(Object.isFrozen(config)); // true
console.log(Object.isSealed(config)); // true — замороженный объект считается запечатанным
Пример: Object.seal — только структура фиксирована
const user = Object.seal({
name: 'Иван',
age: 30,
});
user.name = 'Пётр'; // Работает — изменение существующего свойства разрешено
user.email = 'ivan@example.com'; // Игнорируется — добавление запрещено
delete user.age; // Игнорируется — удаление запрещено
console.log(user.name); // 'Пётр'
console.log(user.email); // undefined
console.log(Object.isSealed(user)); // true
console.log(Object.isFrozen(user)); // false
Пример: Поверхностность и глубокая заморозка
const shallow = Object.freeze({
meta: { version: 1 }, // Вложенный объект НЕ заморожен
});
shallow.meta.version = 99; // Работает!
console.log(shallow.meta.version); // 99
// Глубокая заморозка через рекурсию
function deepFreeze<T extends object>(obj: T): Readonly<T> {
Object.getOwnPropertyNames(obj).forEach((name) => {
const value = (obj as Record<string, unknown>)[name];
if (value && typeof value === 'object') {
deepFreeze(value as object);
}
});
return Object.freeze(obj);
}
const deep = deepFreeze({ meta: { version: 1 } });
deep.meta.version = 99; // TypeError в strict mode
console.log(deep.meta.version); // 1
Типичные ошибки
Путают freeze и seal — думают, что seal тоже запрещает изменение значений свойств
Не знают о поверхностности (shallow) и считают, что заморозка распространяется на вложенные объекты
Не знают о поведении в нестрогом режиме — ожидают ошибку, но её нет
Думают, что freeze влияет на переменную, а не на объект (const + freeze — разные вещи)
Не знают о методах isFrozen и isSealed для проверки состояния объекта


