Reflect

About

Reflect это встроенный объект, предоставляющий методы для перехватываемых операций JavaScript. Это те же самые методы, что имеются в обработчиках Proxy. Объект Reflect не является функцией.

Reflect помогает при пересылке стандартных операций из обработчика к целевому объекту.

Например, метод Reflect.has() это тот же оператор in но в виде функции:

Reflect.has(Object, 'assign'); // true

Улучшенная функция apply

В ES5 обычно используется метод Function.prototype.apply() для вызова функции в определенном контексте (с определенным this) и с параметрами, заданными в виде массива (или массиво-подобного объекта).

Function.prototype.apply.call(Math.floor, undefined, [1.75]);

С методом Reflect.apply эта операция менее громоздка и более понятна:

Reflect.apply(Math.floor, undefined, [1.75]);
// 1;

Reflect.apply(String.fromCharCode, undefined, [104, 101, 108, 108, 111]);
// "hello"

Reflect.apply(RegExp.prototype.exec, /ab/, ['confabulation']).index;
// 4

Reflect.apply(''.charAt, 'ponies', [3]);
// "i"

Проверка успешности определения нового свойства

Метод Object.defineProperty, в случае успеха операции, возвращает объект, а при неудаче вызывает ошибку TypeError. Из-за этого определение свойств требует обработки блоком try...catch для перехвата возможных ошибок. Метод Reflect.defineProperty, в свою очередь, возвращает успешность операции в виде булева значения, благодаря чему возможно использование простого if...else условия:

if (Reflect.defineProperty(target, property, attributes)) {
  // успех
} else {
  // что-то пошло не так
}

Last updated