从记录的内容来看,它们似乎具有几乎相同的功能,除了:
- 反映当时只能指定一个陷阱。
- 代理是可撤销的。
- 代理是一个构造函数。
如果上面的列表总结了所有差异,那么两者兼有的理由是什么?
Reflect 和 Proxy 有着完全不同的目的和不同的能力。
该
Proxy
对象用于定义基本操作的自定义行为(例如属性查找、赋值、枚举、函数调用等)。
Reflect是一个内置对象,它为可拦截的 JavaScript 操作提供方法。这些方法与代理处理程序的方法相同。
我知道您可能已经阅读过该内容,因此我将使用一个示例来进一步解释它。
假设您有一个对象:
const obj = {
a: 'foo',
b: 'bar',
};
您可以a
像这样使用属性访问器访问属性:
console.log(obj.a); // 'foo'
您可以使用Reflect.get()
以下方法执行相同操作:
console.log(Reflect.get(obj, 'a')); // 'foo'
您还可以使用 Proxy 构造函数创建该对象的代理。我们将使用get
处理程序来拦截所有属性查找。
const proxy = new Proxy(obj, {
get(target, property) {
return property in target ? target[property] : 'default';
},
});
现在使用属性访问器或Reflect.get()
获取未定义的属性会导致字符串'default'
:
console.log(proxy.c); // 'default'
console.log(Reflect.get(proxy, 'c')); // 'default'
代理和反射可以很好地协同工作。get
例如,您可以使用 Reflect创建一个带有无操作处理程序的代理:
new Proxy(obj, {
get: Reflect.get,
});