Что такое Object.freeze и Object.seal в JavaScript?

JuniorJavaScript · Frontend·Обновлено 28 июля 2026
Коротко
Object.freeze делает объект полностью неизменяемым: нельзя добавлять, удалять или изменять свойства. Object.seal запрещает добавление и удаление свойств, но позволяет изменять значения существующих.

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 для проверки состояния объекта

Лучшие курсы по теме

изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Feature-Sliced Design

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.6
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее