Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що робить Object.preventExtensions()?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**`Object.preventExtensions()`** - це вбудований метод JavaScript, який **забороняє додавати нові властивості в об'єкт**, але **дозволяє змінювати і видаляти вже наявні**. **Ключове:** це найм'якіша форма захисту об'єкта, на відміну від `seal()` і `freeze()`.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення`Object.preventExtensions()` - це вбудований метод JavaScript, який **забороняє додавати нові властивості в об'єкт**, але **дозволяє змінювати і видаляти вже наявні**. Це найм'якіша форма захисту об'єкта (на відміну від `seal()` і `freeze()`). --- ## Коротко Синтаксис: ```javascript Object.preventExtensions(obj) ``` | Аргумент | Опис | |---|---| | `obj` | Об'єкт, у який **не можна буде додати нові властивості** | Повертає сам об'єкт (уже "заборонений для розширення"). --- ## Приклад ```javascript const user = { name: 'Tim', age: 25 }; Object.preventExtensions(user); user.city = 'Kyiv'; // не додасться delete user.age; // можна видалити user.name = 'Oleh'; // можна змінити console.log(user); // { name: 'Oleh' } ``` Після `Object.preventExtensions()`: - **не можна додати** нові властивості; - **можна видалити** старі; - **можна змінювати** наявні значення. --- ## Перевірити, чи можна розширювати об'єкт ```javascript console.log(Object.isExtensible(user)); // false ``` `Object.isExtensible(obj)` повертає `false`, якщо в об'єкт не можна додавати нові властивості. --- ## Що відбувається "під капотом" `Object.preventExtensions(obj)` робить таке: - забороняє додавання нових властивостей (зокрема через `Object.defineProperty()`); - наявні властивості **залишаються змінюваними і видаляються**; - `configurable`, `writable`, `enumerable` не чіпаються. --- ## Приклад: спроба додати нову властивість ```javascript const obj = {}; Object.preventExtensions(obj); try { Object.defineProperty(obj, 'x', { value: 1 }); } catch (err) { console.log('Помилка:', err.message); } ``` Кине помилку (у строгому режимі): ```javascript Помилка: Cannot define property x, object is not extensible ``` --- ## Відмінності від `seal()` і `freeze()` | Метод | Можна додавати | Можна видаляти | Можна змінювати | Дескриптори `configurable` | |---|---|---|---|---| | `preventExtensions()` | Ні | Так | Так | Без змін | | `seal()` | Ні | Ні | Так | Усі `configurable: false` | | `freeze()` | Ні | Ні | Ні | Усі `configurable: false`, `writable: false` | Тобто `preventExtensions()` - це **найм'якіший варіант захисту**. Він просто "закриває вхід", але не заважає працювати з тим, що вже є. --- ## Приклад - перевіримо на прототипи ```javascript const parent = { role: 'user' }; const child = Object.create(parent); Object.preventExtensions(child); child.name = 'Tim'; // не додасться console.log(child.name); // undefined console.log(child.role); // "user" (успадковано з прототипу) ``` `preventExtensions()` не впливає на **успадковані властивості** - вони залишаються доступні через прототип. --- ## ПІДСУМОК | Поведінка | Дозволено? | |---|---| | Додавати нові властивості | Ні | | Видаляти наявні | Так | | Змінювати значення | Так | | Змінювати дескриптори | Так | | Перевірка | `Object.isExtensible(obj)` |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.