Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 代理构造函数和反射之间的区别是什么?_Javascript_Reflection_Ecmascript 6_Es6 Proxy - Fatal编程技术网

Javascript 代理构造函数和反射之间的区别是什么?

Javascript 代理构造函数和反射之间的区别是什么?,javascript,reflection,ecmascript-6,es6-proxy,Javascript,Reflection,Ecmascript 6,Es6 Proxy,和之间是否存在显著差异 从所记录的情况来看,它们似乎具有几乎相同的功能,除了: 一次只能指定一个陷阱 代理存在 代理是一个构造函数 如果上面的列表总结了所有的差异,那么两者的原理是什么?反射和代理具有完全不同的目的和不同的功能 : 代理对象用于定义基本操作(例如属性查找、赋值、枚举、函数调用等)的自定义行为 : Reflect是一个内置对象,为可拦截的JavaScript操作提供方法。这些方法与其他方法相同 我知道你可能已经读过了,所以我将用一个例子来进一步解释它 假设您有一个对象: con

和之间是否存在显著差异

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

  • 一次只能指定一个陷阱
  • 代理存在
  • 代理是一个构造函数

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

反射和代理具有完全不同的目的和不同的功能

:

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

:

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

我知道你可能已经读过了,所以我将用一个例子来进一步解释它

假设您有一个对象:

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

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

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”

console.log(proxy.c); // 'default'
console.log(Reflect.get(proxy, 'c')); // 'default'

代理和反射可以很好地协同工作。例如,您可以使用反射创建一个带有无操作
get
处理程序的代理:

new Proxy(obj, {
  get: Reflect.get,
});