Что такое Object.freeze() и чем отличается от Object.seal()?

👨‍💻 Frontend Developer 🟠 Может встретиться 🎚️ Средний
#JavaScript #Объекты #База JS

Краткий ответ

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


Полный ответ

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

Object.freeze()

Делает объект полностью неизменяемым:

const obj = { name: 'Иван', age: 25 };
Object.freeze(obj);
 
// Все эти операции не сработают
obj.name = 'Петр'; // Не изменится
obj.city = 'Москва'; // Не добавится
delete obj.age; // Не удалится

Object.seal()

Защищает только структуру объекта:

const obj = { name: 'Иван', age: 25 };
Object.seal(obj);
 
// Можно менять значения
obj.name = 'Петр'; // Сработает
 
// Нельзя добавлять/удалять свойства
obj.city = 'Москва'; // Не добавится
delete obj.age; // Не удалится

Главные отличия

Object.freeze()

  • Нельзя изменять значения свойств
  • Нельзя добавлять свойства
  • Нельзя удалять свойства
  • Полная блокировка

Object.seal()

  • Можно изменять значения свойств
  • Нельзя добавлять свойства
  • Нельзя удалять свойства
  • Частичная блокировка

Простые примеры

Когда использовать freeze

// Конфигурация, которую нельзя менять
const config = { 
  apiEndpoint: 'https://api.example.com',
  timeout: 5000 
};
 
Object.freeze(config);
// Теперь config полностью защищен

Когда использовать seal

// Объект с фиксированным набором полей
const user = { name: 'Иван', age: 25 };
Object.seal(user);
 
// Можно обновить данные пользователя
user.name = 'Петр';
user.age = 30;
 
// Но нельзя добавить новые поля
user.email = 'test@example.com'; // Не сработает

Проверка состояния

Проверить, заморожен ли объект

const obj = { name: 'Иван' };
Object.freeze(obj);
console.log(Object.isFrozen(obj)); // true

Проверить, запечатан ли объект

const obj = { name: 'Иван' };
Object.seal(obj);
console.log(Object.isSealed(obj)); // true

Важные моменты

1. Только поверхностная защита

const obj = { 
  user: { name: 'Иван' } 
};
 
Object.freeze(obj);
obj.user.name = 'Петр'; // Сработает! Вложенный объект не заморожен

2. Нельзя разморозить

const obj = { name: 'Иван' };
Object.freeze(obj);
// Нет способа "разморозить" объект

Частые ошибки

1. Ожидание ошибок

// ❌ Не будет ошибки в нестрогом режиме
const obj = { name: 'Иван' };
Object.freeze(obj);
obj.name = 'Петр'; // Тихо не сработает
 
// ✅ В строгом режиме будет ошибка
'use strict';
obj.name = 'Петр'; // TypeError

2. Непонимание вложенности

// ❌ Думаем, что всё заморожено
const obj = { user: { name: 'Иван' } };
Object.freeze(obj);
obj.user.name = 'Петр'; // Сработает!
 
// ✅ Нужно замораживать вложенные объекты
Object.freeze(obj.user);
obj.user.name = 'Петр'; // Теперь не сработает

Простые правила

  1. freeze — когда объект должен быть полностью неизменяемым
  2. seal — когда структура фиксирована, но значения можно менять
  3. Поверхностная защита — только первый уровень объекта
  4. Нельзя отменить — после freeze/seal объект нельзя вернуть в исходное состояние
  5. Тихое поведение — в нестрогом режиме изменения просто игнорируются

Понимание разницы между freeze и seal помогает создавать более надежный код и предотвращать нежелательные изменения данных.


Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪