Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.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 指代代理';这是在一个类getter中创建的_Javascript_Ecmascript 6_Es6 Class - Fatal编程技术网

Javascript 指代代理';这是在一个类getter中创建的

Javascript 指代代理';这是在一个类getter中创建的,javascript,ecmascript-6,es6-class,Javascript,Ecmascript 6,Es6 Class,我有以下人工代码: class Animal { get age() { return this.baseage + 10; } age2() { return this.baseage + 10; } } const handler = { "get": function(target, key) { if (key === "baseage") { return 20; } return target[ke

我有以下人工代码:

class Animal {
  get age() {
    return this.baseage + 10;
  }

  age2() {
    return this.baseage + 10;
  }
}

const handler = {
  "get": function(target, key) {
     if (key === "baseage") {
       return 20;
     }

     return target[key];
  }
};

const animal = new Proxy(new Animal(), handler);

console.log(animal.age);
console.log(animal.age2());
产生

NaN
30
在节点6.11.0上


我希望getter类中的代码,特别是
this.baseage
,也会经过代理的处理程序,但情况似乎并非如此。有什么原因吗?

返回目标[key]与默认的
get
处理程序的行为不同。这是导致“获取年龄”功能中断的原因

const handler = {
  "get": function(target, key) {
     if (key === "baseage") {
       return 20;
     }

     return target[key];
  }
};
应该是

const handler = {
  "get": function(target, key, receiver) {
     if (key === "baseage") {
       return 20;
     }

     return Reflect.get(target, key, receiver);
  }
};
当您执行
target[key]
时,您正在调用
get age(){
,但您将其与
目标
一起调用为
,它是
新动物
对象,而不是代理。由于代理对象是处理
基准
的对象,而不是
动物
,因此返回
未定义

在本例中,
receiver
是实际的代理对象,因此您可能会执行
receiver[key]
以使代码段正常工作,但还有大量的边缘情况您仍然无法以常规方式处理

每个
Proxy
处理程序函数都有一个
Reflect.XX
版本,该版本公开了默认行为。每当您编写代理时,只要希望它正常运行,就应该使用
Reflect