← Назад к вопросам

В чем разница между Object.freeze() и Object.seal()?

2.2 Middle🔥 81 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между Object.freeze() и Object.seal()

Основные различия

Object.freeze() и Object.seal() — это методы для защиты объектов от изменений, но они работают на разных уровнях контроля. Оба метода делают объект нежелезным, но степень защиты отличается.

Object.seal()

Object.seal() позволяет изменять существующие свойства, но запрещает добавлять новые и удалять старые свойства:

const user = { name: 'Alice', age: 30 };
Object.seal(user);

// Можно изменять существующие свойства
user.name = 'Bob';        // OK
user.age = 31;            // OK
console.log(user);        // { name: 'Bob', age: 31 }

// Нельзя добавлять новые свойства
user.email = 'bob@example.com';  // Ошибка в strict mode, молча игнорируется в обычном режиме

// Нельзя удалять свойства
delete user.name;  // Ошибка в strict mode, молча игнорируется в обычном режиме

Object.freeze()

Object.freeze() полностью замораживает объект: нельзя менять, добавлять или удалять свойства. Объект становится полностью неизменяемым:

const user = { name: 'Alice', age: 30 };
Object.freeze(user);

// Нельзя изменять свойства
user.name = 'Bob';        // Ошибка в strict mode, молча игнорируется
user.age = 31;            // Ошибка в strict mode, молча игнорируется

// Нельзя добавлять новые свойства
user.email = 'bob@example.com';  // Ошибка в strict mode, молча игнорируется

// Нельзя удалять свойства
delete user.name;  // Ошибка в strict mode, молча игнорируется

console.log(user);  // { name: 'Alice', age: 30 } — объект не изменился

Сравнительная таблица

ОперацияObject.seal()Object.freeze()
Изменение существующих свойствРазрешеноЗапрещено
Добавление новых свойствЗапрещеноЗапрещено
Удаление свойствЗапрещеноЗапрещено
Вложенные объектыНе защищеныНе защищены

Проверка статуса объекта

Для проверки того, что произошло с объектом, используются специальные методы:

const user = { name: 'Alice' };

console.log(Object.isSealed(user));     // false
console.log(Object.isFrozen(user));     // false

Object.seal(user);
console.log(Object.isSealed(user));     // true
console.log(Object.isFrozen(user));     // false

Object.freeze(user);
console.log(Object.isSealed(user));     // true (frozen объект считается sealed)
console.log(Object.isFrozen(user));     // true

console.log(Object.isExtensible(user)); // false (оба метода запрещают расширение)

Поверхностная защита

Важно помнить: оба метода защищают только верхний уровень объекта. Вложенные объекты остаются мутируемыми:

const config = {
  app: 'MyApp',
  database: { host: 'localhost', port: 5432 }
};

Object.freeze(config);

// Нельзя менять корневые свойства
config.app = 'NewApp';  // Ошибка в strict mode

// Но можно менять вложенный объект!
config.database.host = '192.168.1.1';  // OK!
console.log(config.database.host);     // '192.168.1.1'

Для глубокой заморозки нужно рекурсивно применить freeze:

function deepFreeze(obj) {
  Object.freeze(obj);
  Object.getOwnPropertyNames(obj).forEach(prop => {
    if (obj[prop] !== null && typeof obj[prop] === 'object') {
      deepFreeze(obj[prop]);
    }
  });
  return obj;
}

const config = {
  app: 'MyApp',
  database: { host: 'localhost', port: 5432 }
};

deepFreeze(config);
config.database.host = '192.168.1.1';  // Ошибка в strict mode

Практическое применение

Object.seal() используется когда:

  • Вы хотите зафиксировать структуру объекта
  • Нужно разрешить изменение значений существующих свойств
  • Нужна умеренная защита от ошибок
const userSettings = { theme: 'dark', language: 'en' };
Object.seal(userSettings);
// Можно менять значения: userSettings.theme = 'light'
// Нельзя добавлять новые: userSettings.notifications = true

Object.freeze() используется когда:

  • Нужна полная неизменяемость (константные данные)
  • Вы работаете с конфигурациями, которые не должны меняться
  • Нужно предотвратить случайные мутации
const API_CONFIG = Object.freeze({
  BASE_URL: 'https://api.example.com',
  TIMEOUT: 5000
});
// Ничего нельзя менять

Производительность

Оба метода работают с примерно одинаковой скоростью, но:

  • Замороженные/sealed объекты позволяют движку JavaScript оптимизировать доступ к свойствам
  • При правильном использовании это может улучшить производительность
  • Вложенные глубокой заморозки могут быть дорогостоящими для больших структур
В чем разница между Object.freeze() и Object.seal()? | PrepBro