Skip to main content

Флаги writable, enumerable, configurable?

Флаги writable, enumerable та configurable - це три службові параметри (флага) в дескрипторі властивості (property descriptor), які керують поведінкою властивостей об'єктів у JavaScript.

Ці флаги не видно при звичайному використанні, але вони визначають, чи можна змінювати, видаляти або перелічувати властивість.

Коротко

ФлагЩо робитьТипово
writableДозволяє змінювати значення властивостіfalse (якщо властивість створена через defineProperty)
enumerableРобить властивість видимою при переборі (for...in, Object.keys)false
configurableДозволяє видаляти властивість і змінювати її флагиfalse

Приклад для всіх трьох

javascript
const user = {}; Object.defineProperty(user, 'name', { value: 'Tim', writable: false, // не можна змінювати enumerable: false, // не з'являється в циклах configurable: false // не можна видалити або змінити флаги }); console.log(user.name); // "Tim" user.name = 'Oleh'; // не зміниться delete user.name; // не видалиться console.log(Object.keys(user)); // [] - не перелічується

1. writable - "чи можна змінювати значення"

javascript
const user = {}; Object.defineProperty(user, 'age', { value: 25, writable: false }); user.age = 30; // не спрацює console.log(user.age); // 25
  • writable: true -> можна змінювати значення
  • writable: false -> властивість тільки для читання

2. enumerable - "чи показувати властивість при переборі"

javascript
const user = {}; Object.defineProperty(user, 'secret', { value: '12345', enumerable: false }); console.log(user.secret); // доступно напряму console.log(Object.keys(user)); // [] (не видно) for (const key in user) console.log(key); // нічого
  • enumerable: true -> властивість видно в for...in, Object.keys(), JSON.stringify()
  • enumerable: false -> "прихована" властивість

Приклад з реальності - вбудовані методи (toString, valueOf) мають enumerable: false, щоб не заважати під час перебору.

3. configurable - "чи можна видалити або змінити флаги"

javascript
const user = {}; Object.defineProperty(user, 'id', { value: 10, configurable: false }); delete user.id; // не видалиться console.log(user.id); // 10 // Спробуємо змінити writable: Object.defineProperty(user, 'id', { writable: true }); // TypeError: Cannot redefine property: id
  • configurable: true -> можна видалити властивість або змінити її флаги
  • configurable: false -> не можна видалити, і не можна змінити enumerable / configurable / writable: false -> true

Єдине, що можна змінити - це writable: true -> false, але не навпаки.

Як отримати значення флагів

javascript
const obj = { name: 'Tim' }; const descriptor = Object.getOwnPropertyDescriptor(obj, 'name'); console.log(descriptor);

Виведе:

javascript
{ value: 'Tim', writable: true, enumerable: true, configurable: true }

Як задати з флагами

javascript
Object.defineProperty(obj, 'prop', { value: 42, writable: false, enumerable: true, configurable: false });

Підсумок

ФлагПризначенняПриклад
writableЧи можна змінювати значення властивостіuser.age = 30
enumerableЧи видно властивість при переборіObject.keys(user)
configurableЧи можна видалити або перевизначити властивістьdelete user.prop

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

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

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