0Pricing
JavaScript Academy · Урок

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 — локальная установка не требуется.

Все уроки этого курса

  1. Создание Proxy
  2. Ловушки get и set
  3. API Reflect
  4. Практические сценарии применения Proxy
← Назад к JavaScript Academy