Reflect和Proxy具有完全不同的用途和不同的功能。
MDN describes Proxy in that way:
Proxy
对象用于定义基本操作的自定义行为(例如,属性查找,赋值,枚举,函数调用等)。
Reflect是一个内置对象,为可拦截的JavaScript操作提供方法。这些方法与proxy handlers的方法相同。
我意识到你可能已经读过了,所以我将用一个例子来进一步解释它。
假设你有一个对象:
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'
Proxy和Reflect可以很好地协同工作。例如,您可以使用Reflect创建一个带有no-op get
处理程序的代理:
new Proxy(obj, {
get: Reflect.get,
});