Що робить 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):
- Забороняє додавання нових властивостей (
Object.preventExtensions(obj)); - Для всіх наявних властивостей робить
configurable: false- їх не можна видалити або змінити дескриптор; - Залишає
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
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.