Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Флаги writable, enumerable, configurable?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Флаги `writable`, `enumerable` та `configurable`** - це три службові параметри в дескрипторі властивості (property descriptor), які керують поведінкою властивостей об'єктів у JavaScript. **Ключове:** `writable` дозволяє змінювати значення властивості, `enumerable` робить її видимою при переборі (`for...in`, `Object.keys`), а `configurable` дозволяє видаляти властивість і змінювати її флаги.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняФлаги `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` |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.