我在Map对象上创建了一个简单的Proxy示例。我无法弄清楚为什么没有执行Set处理程序而是为Sets执行Get。
const handler = {
get: (targetObj, propName, receiverProxy) => {
console.log('PROXY: From get.')
let ret = Reflect.get(targetObj, propName, receiverProxy)
if (typeof ret === 'function') {
ret = ret.bind(targetObj)
}
return ret
},
set: (targetObj, propName, propValue, receiverProxy) => {
console.log('PROXY: From set.')
return Reflect.set(targetObj, propName, propValue, receiverProxy)
},
}
const targetMap = new Map([
['iron', 'man'],
])
const targetObj = {}
const proxy = new Proxy(targetMap, handler)
console.log(proxy.set('super', 'man'))
console.log(proxy.get('super'))
答案 0 :(得分:0)
Set and get不能那样工作。
您可以像使用任何普通对象一样使用代理对象。例如:
proxy.super = 'man'; // fires the setter
const x = proxy.super; // fires the getter
然后,在get
/ set
处理程序中,您可以调用get
上的原始set
/ targetObj
方法。
答案 1 :(得分:0)
如果您希望代理设置可以拦截对Map .set()
方法的尝试调用,则您必须执行以下操作:
let handler = {
get: (target, property, proxy) {
if (property === "set") {
console.log("intercepted a '.set' access on the proxied map");
return (key, value) => {
console.log("intercepted a 'set()' call on the proxied map");
return target.set(key, value);
};
}
return target[property];
}
};
" get"调用handler方法以尝试任何属性访问。在方法调用中
proxy.set("some key", "some value");
" set"在实际调用方法之前,必须查找对象的属性。这是导致处理程序" get"的查找操作。方法调用。
现在,如果您在代码中创建代理,然后执行
proxy.set("some key", "some value");
你会看到日志消息在"拦截器"你调用的函数被调用。