Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що робить Object.seal()?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**`Object.seal()`** - це вбудований метод JavaScript, який "запечатує" об'єкт: забороняє додавати чи видаляти властивості, але дозволяє змінювати значення вже наявних властивостей. **Ключове:** це проміжний варіант між `Object.preventExtensions()` і `Object.freeze()`, і діє лише поверхнево - на верхньому рівні об'єкта.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення`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)` | | | Глибина | Поверхнево (тільки верхній рівень) | |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.