Що робить Object.preventExtensions()?
Object.preventExtensions() - це вбудований метод JavaScript,
який забороняє додавати нові властивості в об'єкт,
але дозволяє змінювати і видаляти вже наявні.
Це найм'якіша форма захисту об'єкта (на відміну від seal() і freeze()).
Коротко
Синтаксис:
Object.preventExtensions(obj)| Аргумент | Опис |
|---|---|
obj | Об'єкт, у який не можна буде додати нові властивості |
Повертає сам об'єкт (уже "заборонений для розширення").
Приклад
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():
- не можна додати нові властивості;
- можна видалити старі;
- можна змінювати наявні значення.
Перевірити, чи можна розширювати об'єкт
console.log(Object.isExtensible(user)); // falseObject.isExtensible(obj) повертає false,
якщо в об'єкт не можна додавати нові властивості.
Що відбувається "під капотом"
Object.preventExtensions(obj) робить таке:
- забороняє додавання нових властивостей (зокрема через
Object.defineProperty()); - наявні властивості залишаються змінюваними і видаляються;
configurable,writable,enumerableне чіпаються.
Приклад: спроба додати нову властивість
const obj = {};
Object.preventExtensions(obj);
try {
Object.defineProperty(obj, 'x', { value: 1 });
} catch (err) {
console.log('Помилка:', err.message);
}Кине помилку (у строгому режимі):
Помилка: Cannot define property x, object is not extensibleВідмінності від seal() і freeze()
| Метод | Можна додавати | Можна видаляти | Можна змінювати | Дескриптори configurable |
|---|---|---|---|---|
preventExtensions() | Ні | Так | Так | Без змін |
seal() | Ні | Ні | Так | Усі configurable: false |
freeze() | Ні | Ні | Ні | Усі configurable: false, writable: false |
Тобто preventExtensions() - це найм'якіший варіант захисту.
Він просто "закриває вхід", але не заважає працювати з тим, що вже є.
Приклад - перевіримо на прототипи
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) |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.