Proxy构造函数和Reflect有什么区别?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Proxy构造函数和Reflect有什么区别?相关的知识,希望对你有一定的参考价值。

ReflectProxy之间有什么显着差异吗?

从记录的内容来看,它们似乎具有几乎相同的功能,除了:

  • 反映当时只能指定一个陷阱。
  • 代理是revocable
  • 代理是构造函数。

如果上面的列表总结了所有差异,那么两者的理由是什么?

答案

Reflect和Proxy具有完全不同的用途和不同的功能。

MDN describes Proxy in that way

Proxy对象用于定义基本操作的自定义行为(例如,属性查找,赋值,枚举,函数调用等)。

And Reflect in that way

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,
});

以上是关于Proxy构造函数和Reflect有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章

@芥末的糖 ---------- ES6---Proxy与Reflect 实现重载(overload)

java反射和动态代理有啥关系

Vue3 响应式解析Reactivity(Reflect and Proxy)

ES6 Proxy和Reflect

java构造代码块和构造函数内的代码块有啥区别,谁先执行

ES6——Proxy与Reflect