问题描述
代理具有trap for new
operator,从理论上讲,该代理应允许我们创建将构造函数自变量传递到目标对象的代理。其工作方式示例如下:
function monster1(disposition) {
this.disposition = disposition;
}
const handler1 = {
construct(target,args) {
console.log('monster1 constructor called');
// expected output: "monster1 constructor called"
return new target(...args);
},get(...args) {
console.info('get trap triggered!')
}
};
const proxy1 = new Proxy(monster1,handler1);
const instance = new proxy1('fierce')
console.log(instance.disposition);
// expected output: "fierce"
console.log(instance.unkNownProp);
// expected output: "get trap triggered!" <-- doesn't happen
这很好用。除了instance.unkNownProp
现在不再触发get
陷阱之外。我现在如何拦截属性?
解决方法
在Construct
内,您有return new target(...args);
。这样会创建一个没有设置代理的新JS对象。
您应该在新创建的对象上设置一个附加代理,以拦截在那里的属性访问。
赞:
function monster1(disposition) {
this.disposition = disposition;
}
const handler1 = {
construct(target,args) {
console.log('monster1 constructor called');
// expected output: "monster1 constructor called"
const obj = new target(...args);
// Return a Proxy instead of object.
// We may use the same handler1 here,or we can
// create another handler with `get`. Both work,.
return new Proxy(obj,handler1);
},get(...args) {
console.log('get trap triggered!')
return Reflect.get(...args);
}
};
const proxy1 = new Proxy(monster1,handler1);
const instance = new proxy1('fierce')
console.log(instance.disposition);
// expected output: "get trap triggered!"
// expected output: "fierce"
console.log(instance.unknownProp);
// expected output: "get trap triggered!"
,
我还没有尝试过,但是我认为super
是您的答案。 https://www.w3schools.com/jsref/jsref_class_super.asp