Skip to main content

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

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)

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

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

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