描述
与大多数全局对象不同,Reflect 不是一个构造函数。您不能使用 new 操作符 来使用它,也不能将 Reflect 对象作为函数调用。Reflect 的所有属性和方法都是静态的(就像 Math 对象一样)。
Reflect 对象提供了一系列静态函数,它们的名称与 Proxy 处理器方法 相同。
Reflect 的主要用例是在 Proxy 处理器陷阱中提供默认的转发行为。 陷阱 用于拦截对象上的操作——它为 对象内部方法 提供了自定义实现。Reflect API 用于调用相应的内部方法。例如,下面的代码创建一个具有 deleteProperty 陷阱的代理 p,该陷阱拦截 [[Delete]] 内部方法。Reflect.deleteProperty() 用于直接调用 targetObject 上的默认 [[Delete]] 行为。您可以将其替换为 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 值来运行 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。
示例
检测对象是否包含某些属性
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® 2026 语言规范 # sec-reflect-object |
浏览器兼容性
加载中…