В браузерах

Reflect — это встроенный объект, который позволяет создавать методы, перехватывающие операции JavaScript. При этом методы называются так же, как и методы в Proxy handlers. Reflect — это не конструктор. Вы не можете использовать его с оператором new или вызывать Reflect как функцию. Все свойства и методы объекта Reflect являются статическими. Некоторые из этих методов — те же, что и соответствующие им методы класса Object.

Примеры использования

Apply

Вызов функции с заданным контекстом. Аналогичен методу apply в Function

function s(a, b){ return this.value + a + b }
Reflect.apply(s, {value: 100}, [10, 30]);
// 140

Сonstruct

Вызов функции в качестве конструктора. Аналогичен оператору new.

function const1(a, b){};
function const2(){};
var newObj = Reflect.construct(const1, [1, 2], const2);

defineProperty

Определяет новое или изменяет существующее свойство объекта. Возвращает логическое значение, была ли операция успешной Аналогичен методу defineProperty в Object, отличается тем, чьо возвращает логическое значение, а не модифицированный объект.

// создание свойств
var obj = {};
Reflect.defineProperty(obj, 'name', {
value: 'Foo',
writable: true,
configurable: true,
enumerable: true
})

И так далее. Полный список всех методов:

  • Reflect.apply
  • Reflect.construct
  • Reflect.defineProperty
  • Reflect.deleteProperty
  • Reflect.enumerate
  • Reflect.get
  • Reflect.getOwnPropertyDescriptor
  • Reflect.getPrototypeOf
  • Reflect.has
  • Reflect.isExtensible
  • Reflect.ownKeys
  • Reflect.preventExtensions
  • Reflect.set
  • Reflect.setPrototypeOf

Поддержка браузерами

  • Chrome
  • Firefox
  • Edge

Reflect Metadata API

В TypeScript ради Angular2 был добавлен расширенный синтаксис декороторов. Одной из интересных особенностей декораторов является возможность получать информацию о типе декорируемого свойства или параметра. Чтобы это заработало, нужно подключить библиотеку reflect-metadata, которая расширяет стандартный объект Reflect и включить опцию emitDecoratorMetadata. После этого для свойств, которые имеют хотя бы один декоратор, можно вызвать Reflect.getMetadata с ключем “design:type”, и получить конструктор соответствующего типа.

Пример использования:

function strictType<T>(t :any, k :string, d:     TypedPropertyDescriptor<T>) :never|void {
d.set = (value :T) :never|void => {
let type = Reflect.getMetadata("design:type", t, k);
if (!(value instanceof type))
throw new TypeError("Invalid type!");
}
}