Skip to main content

Що робить Object.seal()?

Object.seal() - це вбудований метод JavaScript, який "запечатує" об'єкт, забороняючи додавати або видаляти властивості, але дозволяючи змінювати значення наявних властивостей.

Він схожий на Object.freeze(), але трохи м'якший.


Коротко

Синтаксис:

javascript
Object.seal(obj)
АргументОпис
objОб'єкт, який потрібно "запечатати"

Повертає той самий об'єкт, але з обмеженнями.


Приклад

javascript
const user = { name: 'Тим', age: 25 }; Object.seal(user); user.age = 30; // можна змінити значення user.city = 'Berlin'; // не можна додати нове delete user.name; // не можна видалити console.log(user); // { name: 'Тим', age: 30 }

Після Object.seal():

  • не можна додавати нові властивості;
  • не можна видаляти наявні;
  • але можна змінювати значення вже наявних властивостей.

Перевірити, чи запечатаний об'єкт

javascript
console.log(Object.isSealed(user)); // true

Що відбувається "під капотом"

Object.seal(obj):

  1. Забороняє додавання нових властивостей (Object.preventExtensions(obj));
  2. Для всіх наявних властивостей робить configurable: false - їх не можна видалити або змінити дескриптор;
  3. Залишає writable без змін - тому значення можна змінювати.

Приклад із дескриптором

javascript
const user = { name: 'Тим' }; Object.seal(user); console.log(Object.getOwnPropertyDescriptor(user, 'name'));

Виведе:

javascript
{ value: 'Тим', writable: true, enumerable: true, configurable: false }

Видно, що configurable: false, а writable - залишилося true.


Порівняння з Object.freeze()

МетодМожна змінювати значенняМожна додаватиМожна видалятиМожна змінювати дескриптори
Object.preventExtensions()ТакНіТакТак
Object.seal()ТакНіНіНі
Object.freeze()НіНіНіНі

Тобто seal() - проміжний варіант між "гнучким" і "жорстким".


Поверхневість (shallow seal)

Object.seal() не захищає вкладені об'єкти:

javascript
const user = { name: 'Тим', address: { city: 'Berlin' } }; Object.seal(user); user.address.city = 'Lviv'; // можна (вкладений об'єкт не запечатаний) user.city = 'Warsaw'; // не можна (нова властивість) console.log(user.address.city); // "Lviv"

Щоб "запечатати" все дерево, потрібно зробити глибоку запечатку рекурсивно.


Приклад глибокої "запечатки"

javascript
function deepSeal(obj) { Object.seal(obj); for (const key in obj) { if (typeof obj[key] === 'object' && obj[key] !== null && !Object.isSealed(obj[key])) { deepSeal(obj[key]); } } return obj; }

Тепер можна "запечатати" все, включно з вкладеними структурами.


ПІДСУМОК

Що робитьПрикладПоведінка
"Запечатує" об'єктObject.seal(obj)Забороняє додавання і видалення властивостей
Можна змінювати значенняТак
Можна додавати нові властивостіНі
Можна видаляти властивостіНі
ПеревіркаObject.isSealed(obj)
ГлибинаПоверхнево (тільки верхній рівень)

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.