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

时间:2016-08-27 09:52:00

标签: javascript reflection ecmascript-6 es6-proxy

ReflectProxy之间是否存在显着差异?

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

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

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

1 个答案:

答案 0 :(得分:9)

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

MDN describes Proxy in that way

  

static const unsigned char [UCHAR_MAX+1] 对象用于定义基本操作的自定义行为(例如属性查找,赋值,枚举,函数调用等)。

And Reflect in that way

  

Reflect 是一个内置对象,为可拦截的JavaScript操作提供方法。这些方法与proxy handlers的方法相同。

我意识到你可能已经读过了,所以我将用一个例子来进一步解释。

假设你有一个对象:

Proxy

您可以使用以下属性访问器访问属性const obj = { a: 'foo', b: 'bar', };

a

您可以使用console.log(obj.a); // 'foo' 方法执行相同操作:

Reflect.get()

您还可以使用Proxy构造函数创建该对象的代理。我们将使用console.log(Reflect.get(obj, 'a')); // 'foo' 处理程序拦截所有属性查找。

get

现在使用属性访问器或const proxy = new Proxy(obj, { get(target, property) { return property in target ? target[property] : 'default'; }, }); 来获取未定义的属性会产生字符串Reflect.get()

'default'

Proxy和Reflect可以很好地协同工作。例如,您可以使用Reflect:

创建一个带有无操作console.log(proxy.c); // 'default' console.log(Reflect.get(proxy, 'c')); // 'default' 处理程序的代理
get