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'"
Спецификации
Совместимость с браузерами
| 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 |
См. также
© 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