Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що робить Reflect.defineProperty()?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**`Reflect.defineProperty()`** - це сучасний аналог `Object.defineProperty()`, але з більш передбачуваною та безпечною поведінкою: він визначає (додає або змінює) властивість об'єкта із заданим дескриптором і повертає булеве значення, що вказує, чи вдалося це зробити. **Ключове:** на відміну від `Object.defineProperty()`, він не викидає виняток, а просто повертає `false`.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення`Reflect.defineProperty()` - це **сучасний аналог** `Object.defineProperty()`, але з **більш передбачуваною та безпечною поведінкою**. Він визначає (додає або змінює) властивість об'єкта із заданим **дескриптором (property descriptor)** і повертає **булеве значення**, що вказує, чи вдалося це зробити. --- ## Коротко Синтаксис: ```javascript Reflect.defineProperty(target, propertyKey, descriptor) ``` | Аргумент | Опис | |---|---| | `target` | Об'єкт, у якому потрібно визначити властивість | | `propertyKey` | Ім'я властивості (рядок або `Symbol`) | | `descriptor` | Дескриптор - об'єкт з флагами (`value`, `writable`, `enumerable`, `configurable`, `get`, `set`) | Повертає: - `true` - якщо властивість успішно визначено, - `false` - якщо операція не вдалася (наприклад, об'єкт захищений). --- ## Приклад - звичайне використання ```javascript const user = {}; const result = Reflect.defineProperty(user, 'name', { value: 'Alex', writable: true, enumerable: true, configurable: true }); console.log(result); // true console.log(user.name); // "Alex" ``` Те саме, що: ```javascript Object.defineProperty(user, 'name', { ... }) ``` але з важливою відмінністю - `Reflect` **не викидає виняток**, а просто повертає `false`. --- ## Відмінність від Object.defineProperty() | Поведінка | `Object.defineProperty()` | `Reflect.defineProperty()` | |---|---|---| | Повертає | сам об'єкт | `true` / `false` | | При помилці | викидає виняток | повертає `false` | | Підходить для | звичайного коду | безпечних, "рефлективних" операцій | "Рефлективний" - означає такий, що працює з внутрішніми властивостями об'єктів без викидання винятків. --- ## Приклад: безпечна перевірка ```javascript const frozen = Object.freeze({}); try { Object.defineProperty(frozen, 'x', { value: 1 }); } catch (e) { console.log('Помилка:', e.message); } console.log(Reflect.defineProperty(frozen, 'x', { value: 1 })); // false (без помилки) ``` `Reflect.defineProperty()` просто поверне `false`, замість того щоб викидати виняток. --- ## Приклад з аксесорами ```javascript const person = {}; Reflect.defineProperty(person, 'fullName', { get() { return 'Alex Johnson'; }, enumerable: true }); console.log(person.fullName); // "Alex Johnson" ``` Працює однаково для **data** та **accessor** дескрипторів. --- ## Приклад: динамічне визначення властивостей ```javascript const obj = {}; ['name', 'age', 'city'].forEach(key => { Reflect.defineProperty(obj, key, { value: key.toUpperCase(), enumerable: true }); }); console.log(obj); // { name: 'NAME', age: 'AGE', city: 'CITY' } ``` --- ## Повернене значення корисне в умовних операціях ```javascript if (Reflect.defineProperty(user, 'role', { value: 'admin' })) { console.log('Властивість успішно додано'); } else { console.log('Не вдалося додати властивість'); } ``` Зручно, тому що **не потребує try/catch**. --- ## Приклад взаємодії з Proxy У пастці `defineProperty` в `Proxy` метод `Reflect.defineProperty` використовується, щоб делегувати поведінку за замовчуванням: ```javascript const target = {}; const proxy = new Proxy(target, { defineProperty(target, key, descriptor) { console.log(`Додаємо властивість "${key}"`); return Reflect.defineProperty(target, key, descriptor); } }); proxy.x = 10; // автоматично викликає Reflect.defineProperty під капотом ``` У `Proxy` рефлективні методи (`Reflect.*`) допомагають реалізувати поведінку максимально "природно". --- ## ПІДСУМОК | Що робить | Визначає (створює/змінює) властивість об'єкта із зазначеним дескриптором | |---|---| | Повертає | `true` при успіху, `false` при невдачі | | Не викидає помилок | Так | | Використовує дескриптор | Так (`value`, `writable`, `configurable`, `enumerable`, `get`, `set`) | | Застосовується в | Безпечних операціях, `Proxy`, метапрограмуванні |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.