API Reflect
Передавайте операции с помощью методов Reflect.
«API Reflect» — бесплатный урок JavaScript Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения JavaScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс JavaScript Academy содержит 4 уроков всего.
Что такое Reflect
Reflect — это встроенный объект с методами, выполняющими стандартные низкоуровневые операции над объектами: чтение, запись, удаление и другие.
Его методы один к одному соответствуют перехватчикам прокси, поэтому это идеальный инструмент для создания корректных прокси.
Reflect.get
Reflect.get(target, prop) читает свойство так же, как target[prop], но в виде обычного вызова функции.
const obj = { name: 'Ada', age: 36 };
console.log(Reflect.get(obj, 'name'));
console.log(Reflect.get(obj, 'age'));Reflect.set
Reflect.set(target, prop, value) записывает свойство и возвращает true или false, указывая на успех операции, как того ожидает перехватчик set.
const obj = {};
const ok = Reflect.set(obj, 'score', 42);
console.log(ok);
console.log(obj.score);Reflect.has и deleteProperty
Reflect.has соответствует оператору in, а Reflect.deleteProperty — операции delete; оба метода являются функциями, возвращающими логические значения.
const obj = { a: 1, b: 2 };
console.log(Reflect.has(obj, 'a'));
console.log(Reflect.deleteProperty(obj, 'b'));
console.log(Reflect.has(obj, 'b'));Reflect.ownKeys
Reflect.ownKeys возвращает все ключи собственных свойств, включая символы и неперечисляемые свойства, поэтому он полнее, чем Object.keys.
const obj = { a: 1, b: 2 };
Object.defineProperty(obj, 'hidden', { value: 3, enumerable: false });
console.log(Object.keys(obj));
console.log(Reflect.ownKeys(obj));Проброс вызовов в прокси
В этом и заключается настоящая сила: внутри перехватчика вызовите соответствующий метод Reflect, чтобы выполнить стандартное поведение, а затем добавьте вокруг него собственную логику.
const proxy = new Proxy({ v: 1 }, {
get(target, prop, receiver) {
console.log('reading ' + prop);
return Reflect.get(target, prop, receiver);
}
});
console.log(proxy.v);Корректный проброс set
Использование Reflect.set внутри перехватчика set автоматически возвращает правильное логическое значение, поэтому вам не нужно самостоятельно помнить о возврате true.
const proxy = new Proxy({}, {
set(target, prop, value, receiver) {
console.log('writing ' + prop);
return Reflect.set(target, prop, value, receiver);
}
});
proxy.x = 10;
console.log(proxy.x);Почему важен получатель
Передача receiver в Reflect.get и Reflect.set гарантирует, что геттеры и сеттеры выполняются с правильным this. Это важно, когда объекты наследуются друг от друга.
const base = { get label() { return 'id-' + this.id; } };
const proxy = new Proxy(base, {
get(target, prop, receiver) {
return Reflect.get(target, prop, receiver);
}
});
const child = Object.create(proxy);
child.id = 7;
console.log(child.label);Reflect.apply
Reflect.apply(fn, thisArg, argsArray) вызывает функцию с заданным this и массивом аргументов и является более аккуратной альтернативой fn.apply.
function greet(greeting, name) {
return greeting + ', ' + name;
}
console.log(Reflect.apply(greet, null, ['Hello', 'Ada']));Reflect.construct
Reflect.construct(Cls, argsArray) создаёт экземпляр; это эквивалент new Cls(...args), но с массивом аргументов.
class Point {
constructor(x, y) { this.x = x; this.y = y; }
}
const p = Reflect.construct(Point, [3, 4]);
console.log(p.x, p.y);Почему Reflect важен
Reflect предоставляет предсказуемые варианты внутренних операций в виде функций и идеально сочетается с прокси: каждый перехватчик передаёт выполнение соответствующему методу Reflect. В результате получается корректный и компактный код прокси. Далее вы примените всё это к практическим задачам.
const audited = new Proxy({ balance: 100 }, {
set(t, p, v, r) {
console.log(p + ': ' + t[p] + ' -> ' + v);
return Reflect.set(t, p, v, r);
}
});
audited.balance = 150;
console.log(audited.balance);Быстрая проверка
Зачем вызывать Reflect.get(target, prop, receiver) внутри перехватчика get вместо target[prop]?
Итоги: программный интерфейс Reflect
Вы изучили инструмент, дополняющий Proxy:
Reflectпредоставляет стандартные операции в виде функций:get,set,has,deleteProperty,ownKeys.- Его методы один к одному соответствуют перехватчикам прокси.
- Передача операции через
Reflectс указаниемreceiverсохраняет корректное наследование. Reflect.applyиReflect.constructпозволяют аккуратно вызывать функции и создавать экземпляры.
Часто задаваемые вопросы
Урок «API Reflect» бесплатный?
Да — полный текст урока «API Reflect» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс JavaScript Academy, подпишись на CoddyKit PRO. Курс JavaScript Academy содержит 4 уроков всего.
Чему я научусь в уроке «API Reflect»?
Передавайте операции с помощью методов Reflect. Ты практикуешь JavaScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать JavaScript Academy?
Предыдущий опыт не требуется. JavaScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «API Reflect»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке JavaScript Academy?
Да. Каждый урок JavaScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.