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