Що робить Reflect?
Що таке Reflect
Reflect - це вбудований об'єкт, який містить набір допоміжних методів для роботи з об'єктами:
доступ до властивостей, їх видалення, створення, виклик функцій тощо.
Простіше кажучи:
Reflect - це набір "безпечних" аналогів операторів JS (in, delete, [], Object.defineProperty() тощо),
зібраний в одному місці.
Основні цілі Reflect:
- Єдиний інтерфейс для низькорівневих операцій над об'єктами
→ замість різних операторів і функцій (
delete,in,Object.definePropertyтощо) - Робота в парі з Proxy → щоб ви могли делегувати дії назад до оригінального об'єкта.
- Більш передбачувана поведінка
→ методи повертають
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")); // falseReflect і 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 |
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.