Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що робить Reflect?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**`Reflect`** - це вбудований об'єкт, який містить набір допоміжних методів для роботи з об'єктами: доступ до властивостей, їх видалення, створення, виклик функцій тощо. **Ключове:** `Reflect` - це набір "безпечних" аналогів операторів JS (`in`, `delete`, `[]`, `Object.defineProperty()` тощо), зібраних в одному місці.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## Що таке **Reflect** `Reflect` - це **вбудований об'єкт**, який містить набір **допоміжних методів** для роботи з об'єктами: доступ до властивостей, їх видалення, створення, виклик функцій тощо. Простіше кажучи: `Reflect` - це **набір "безпечних" аналогів операторів JS** (`in`, `delete`, `[]`, `Object.defineProperty()` тощо), зібраний в одному місці. --- ## Основні цілі Reflect: 1. **Єдиний інтерфейс** для низькорівневих операцій над об'єктами → замість різних операторів і функцій (`delete`, `in`, `Object.defineProperty` тощо) 2. **Робота в парі з Proxy** → щоб ви могли делегувати дії назад до оригінального об'єкта. 3. **Більш передбачувана поведінка** → методи повертають `true/false`, не викидаючи помилок, якщо операція неможлива. --- ## Приклади популярних методів Reflect | Метод | Що робить | Аналог без Reflect | |---|---|---| | `Reflect.get(obj, prop)` | Повертає значення властивості | `obj[prop]` | | `Reflect.set(obj, prop, value)` | Встановлює значення властивості | `obj[prop] = value` | | `Reflect.has(obj, prop)` | Перевіряє наявність властивості | `"prop" in obj` | | `Reflect.deleteProperty(obj, prop)` | Видаляє властивість | `delete obj[prop]` | | `Reflect.ownKeys(obj)` | Повертає всі ключі (включно з `Symbol`) | `Object.getOwnPropertyNames(obj).concat(Object.getOwnPropertySymbols(obj))` | | `Reflect.defineProperty(obj, prop, desc)` | Визначає властивість | `Object.defineProperty(obj, prop, desc)` | | `Reflect.getOwnPropertyDescriptor(obj, prop)` | Отримує дескриптор властивості | `Object.getOwnPropertyDescriptor(obj, prop)` | | `Reflect.apply(fn, thisArg, argsArray)` | Викликає функцію з контекстом і аргументами | `fn.apply(thisArg, argsArray)` | | `Reflect.construct(fn, argsArray)` | Створює екземпляр (як `new fn(...)`) | `new fn(...argsArray)` | --- ## Приклад використання ```javascript const user = { name: "Tim" }; console.log(Reflect.get(user, "name")); // "Tim" Reflect.set(user, "age", 25); console.log(user); // { name: "Tim", age: 25 } console.log(Reflect.has(user, "age")); // true Reflect.deleteProperty(user, "age"); console.log(Reflect.has(user, "age")); // false ``` --- ## Reflect і Proxy разом `Reflect` часто використовують **усередині пасток Proxy**, щоб "пробросити" стандартну поведінку назад до цільового об'єкта (`target`). Приклад: ```javascript const user = { name: "Tim" }; const proxy = new Proxy(user, { get(target, prop, receiver) { console.log(`Читання властивості: ${prop}`); // замість target[prop] безпечніше: return Reflect.get(target, prop, receiver); }, set(target, prop, value, receiver) { console.log(`Запис властивості: ${prop} = ${value}`); return Reflect.set(target, prop, value, receiver); } }); proxy.name; // Лог: Читання властивості: name proxy.age = 30; // Лог: Запис властивості: age = 30 ``` Чому так роблять? Тому що `Reflect` гарантує коректну передачу `this` і внутрішнього контексту, на відміну від прямого звернення через `target[prop]`. --- ## Підсумок | Пункт | Опис | |---|---| | `Reflect` | вбудований об'єкт з методами для роботи з об'єктами | | Мета | уніфікувати низькорівневі операції (читання, запис, видалення, створення тощо) | | Особливість | безпечні аналоги операторів, що повертають `true/false` замість помилок | | Часто використовується | усередині пасток `Proxy` |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.