Флаги 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); // 25writable: 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: idconfigurable: 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
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.