Reflect

Baseline 已广泛支持

此特性已非常成熟,可在多种设备和浏览器版本上使用。自 ⁨2016 年 9 月⁩以来,它已在各大浏览器中可用。

Reflect 命名空间对象包含用于调用可拦截的 JavaScript 对象内部方法的静态方法。这些方法与 Proxy 处理器 的方法相同。

描述

与大多数全局对象不同,Reflect 不是一个构造函数。您不能使用 new 操作符 来使用它,也不能将 Reflect 对象作为函数调用。Reflect 的所有属性和方法都是静态的(就像 Math 对象一样)。

Reflect 对象提供了一系列静态函数,它们的名称与 Proxy 处理器方法 相同。

Reflect 的主要用例是在 Proxy 处理器陷阱中提供默认的转发行为。 陷阱 用于拦截对象上的操作——它为 对象内部方法 提供了自定义实现。Reflect API 用于调用相应的内部方法。例如,下面的代码创建一个具有 deleteProperty 陷阱的代理 p,该陷阱拦截 [[Delete]] 内部方法。Reflect.deleteProperty() 用于直接调用 targetObject 上的默认 [[Delete]] 行为。您可以将其替换为 delete,但使用 Reflect 可以避免您记住每个内部方法对应的语法。

js
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 值来运行 getter,而 属性访问器 始终使用当前对象作为 this 值。

几乎每个 Reflect 方法的行为都可以通过其他语法或方法来实现。其中一些方法在 Object 上有同名的对应静态方法,尽管它们之间存在一些细微的差别。确切的差异请参阅每个 Reflect 方法的描述。

静态属性

Reflect[Symbol.toStringTag]

[Symbol.toStringTag] 属性的初始值是字符串 "Reflect"。此属性用于 Object.prototype.toString()

静态方法

Reflect.apply()

使用 argumentsList 参数指定的参数调用 target 函数。另请参阅 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

示例

检测对象是否包含某些属性

js
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

返回对象的自有键

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

向对象添加新属性

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

规范

规范
ECMAScript® 2026 语言规范
# sec-reflect-object

浏览器兼容性

另见