Spec-Zone.ru › JavaScript

Reflect

Baseline Широко доступен

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с сентября 2016 года.

Объект пространства имен Reflect содержит статические методы для вызова перехватываемых внутренних методов объектов JavaScript. Методы такие же, как у обработчиков прокси.

Описание

В отличие от большинства глобальных объектов, Reflect не является конструктором. Вы не можете использовать его с оператором new или вызывать объект Reflect как функцию. Все свойства и методы Reflect являются статическими (как и объект Math).

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

Основной сценарий использования Reflect — обеспечение поведения перенаправления по умолчанию в ловушках обработчика Proxy. Ловушка используется для перехвата операции над объектом — она предоставляет пользовательскую реализацию для внутреннего метода объекта. API Reflect используется для вызова соответствующего внутреннего метода. Например, приведенный ниже код создает прокси p с ловушкой deleteProperty, которая перехватывает внутренний метод [[Delete]]. Reflect.deleteProperty() используется для вызова поведения [[Delete]] по умолчанию непосредственно на targetObject. Вы можете заменить его на delete, но использование Reflect избавляет вас от необходимости запоминать синтаксис, соответствующий каждому внутреннему методу.

const p = new Proxy(
  {},
  {
    deleteProperty(targetObject, property) {
      // Custom functionality: log the deletion
      console.log("Deleting property:", property);

      // Execute the default introspection behavior
      return Reflect.deleteProperty(targetObject, property);
    },
  },
);

Методы Reflect также позволяют более тонко управлять тем, как вызывается внутренний метод. Например, Reflect.construct() — это единственный способ создать целевую функцию с определенным значением new.target. Если вы используете оператор new для вызова функции, значение new.target всегда является самой функцией. Это имеет важное значение для подклассов. В качестве другого примера, Reflect.get() позволяет вам выполнять геттер с пользовательским значением this, в то время как аксессоры свойств всегда используют текущий объект в качестве значения this.

Почти каждое поведение метода Reflect может быть реализовано с помощью другого синтаксиса или метода. Некоторые из этих методов имеют соответствующие статические методы с тем же именем в Object, хотя у них есть некоторые тонкие отличия. Точные различия см. в описании каждого метода Reflect.

Статические свойства

Reflect[Symbol.toStringTag]
Начальное значение свойства [Symbol.toStringTag] — строка "Reflect". Это свойство используется в Object.prototype.toString().

Статические методы

Reflect.apply()
Вызывает функцию target с аргументами, указанными параметром argumentsList. См. также Function.prototype.apply().
Reflect.construct()
Оператор new в виде функции. Эквивалентно вызову new target(...argumentsList). Также предоставляет возможность указать другой прототип.
Reflect.defineProperty()
Аналогично Object.defineProperty(). Возвращает булево значение, равное true, если свойство было успешно определено.
Reflect.deleteProperty()
Оператор delete в виде функции. Эквивалентно вызову delete target[propertyKey].
Reflect.get()
Возвращает значение свойства. Работает как получение свойства объекта (target[propertyKey]) в виде функции.
Reflect.getOwnPropertyDescriptor()
Аналогично Object.getOwnPropertyDescriptor(). Возвращает дескриптор свойства данного свойства, если оно существует на объекте, или undefined в противном случае.
Reflect.getPrototypeOf()
То же, что и Object.getPrototypeOf().
Reflect.has()
Возвращает булево значение, указывающее, есть ли у цели свойство. Либо собственное, либо унаследованное. Работает как оператор in в виде функции.
Reflect.isExtensible()
То же, что и Object.isExtensible(). Возвращает булево значение, равное true, если цель расширяема.
Reflect.ownKeys()
Возвращает массив ключей собственных (не унаследованных) свойств объекта цели.
Reflect.preventExtensions()
Аналогично Object.preventExtensions(). Возвращает булево значение, равное true, если обновление прошло успешно.
Reflect.set()
Функция, присваивающая значения свойствам. Возвращает булево значение, равное true, если обновление прошло успешно.
Reflect.setPrototypeOf()
Функция, устанавливающая прототип объекта. Возвращает булево значение, равное true, если обновление прошло успешно.

Примеры

Определение наличия у объекта определенных свойств

const duck = {
  name: "Maurice",
  color: "white",
  greeting() {
    console.log(`Quaaaack! My name is ${this.name}`);
  },
};

Reflect.has(duck, "color");
// true
Reflect.has(duck, "haircut");
// false

Возврат собственных ключей объекта

Reflect.ownKeys(duck);
// [ "name", "color", "greeting" ]

Добавление нового свойства к объекту

Reflect.set(duck, "eyes", "black");
// returns "true" if successful
// "duck" now contains the property "eyes: 'black'"

Спецификации

Спецификация
Спецификация языка ECMAScript® 2027
# sec-reflect-object

Совместимость с браузерами

Desktop Mobile Server
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
Reflect
49
12
42
36
10
49
42
36
10
5.0
49
10
1.0.0
1.0
6.0.0
apply
49
12
42
36
10
49
42
36
10
5.0
49
10
1.0.0
1.0
6.0.0
construct
49
12
42
36
10
49
42
36
10
5.0
49
10
1.0.0
1.0
6.0.0
defineProperty
49
12
42
36
10
49
42
36
10
5.0
49
10
1.0.0
1.0
6.0.0
deleteProperty
49
12
42
36
10
49
42
36
10
5.0
49
10
1.0.0
1.0
6.0.0
get
49
12
42
36
10
49
42
36
10
5.0
49
10
1.0.0
1.0
6.0.0
getOwnPropertyDescriptor
49
12
42
36
10
49
42
36
10
5.0
49
10
1.0.0
1.0
6.0.0
getPrototypeOf
49
12
42
36
10
49
42
36
10
5.0
49
10
1.0.0
1.0
6.0.0
has
49
12
42
36
10
49
42
36
10
5.0
49
10
1.0.0
1.0
6.0.0
isExtensible
49
12
42
36
10
49
42
36
10
5.0
49
10
1.0.0
1.0
6.0.0
ownKeys
49
12
42
36
10
49
42
36
10
5.0
49
10
1.0.0
1.0
6.0.0
preventExtensions
49
12
42
36
10
49
42
36
10
5.0
49
10
1.0.0
1.0
6.0.0
set
49
12
42
36
10
49
42
36
10
5.0
49
10
1.0.0
1.0
6.0.0
setPrototypeOf
49
12
42
36
10
49
42
36
10
5.0
49
10
1.0.0
1.0
6.0.0

См. также

  • Proxy

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API