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

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

1️⃣ Как кратко ответить

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

2️⃣ Подробное объяснение темы

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

Object.freeze()

Object.freeze() делает объект полностью неизменяемым. Это значит, что после применения этого метода:

  • Нельзя добавлять новые свойства.
  • Нельзя удалять существующие свойства.
  • Нельзя изменять значения существующих свойств.
  • Нельзя изменять перечислимость, конфигурируемость или записываемость свойств.

Пример:

const obj = {
  name: 'John',
  age: 30
};
​
Object.freeze(obj);
​
obj.age = 31; // Не сработает, age останется 30
obj.gender = 'male'; // Не сработает, свойство gender не будет добавлено
delete obj.name; // Не сработает, свойство name не будет удалено
  • const obj = {...}: Создаем объект с двумя свойствами name и age.
  • Object.freeze(obj): Применяем Object.freeze(), чтобы сделать объект неизменяемым.
  • obj.age = 31;: Попытка изменить значение свойства age не сработает.
  • obj.gender = 'male';: Попытка добавить новое свойство gender не сработает.
  • delete obj.name;: Попытка удалить свойство name не сработает.

Object.seal()

Object.seal() делает объект частично неизменяемым. После применения этого метода:

  • Нельзя добавлять новые свойства.
  • Нельзя удалять существующие свойства.
  • Можно изменять значения существующих свойств.
  • Нельзя изменять конфигурируемость свойств, но можно изменять их значения.

Пример:

const obj = {
  name: 'John',
  age: 30
};
​
Object.seal(obj);
​
obj.age = 31; // Сработает, age изменится на 31
obj.gender = 'male'; // Не сработает, свойство gender не будет добавлено
delete obj.name; // Не сработает, свойство name не будет удалено
  • const obj = {...}: Создаем объект с двумя свойствами name и age.
  • Object.seal(obj): Применяем Object.seal(), чтобы сделать объект частично неизменяемым.
  • obj.age = 31;: Изменение значения свойства age сработает.
  • obj.gender = 'male';: Попытка добавить новое свойство gender не сработает.
  • delete obj.name;: Попытка удалить свойство name не сработает.

Применение

  • Используйте Object.freeze(), когда хотите полностью защитить объект от изменений.
  • Используйте Object.seal(), когда хотите разрешить изменение значений, но запретить добавление или удаление свойств.

Эти методы полезны для обеспечения целостности данных, особенно в больших приложениях, где объекты могут быть изменены в разных частях кода.

Тема: JavaScript
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки