var target = {}
var handler = {
get (target, key) {
console.info('get')
return target[key]
},
set (target, key, value) {
console.info('set')
return true
}
}
var proxy = new Proxy(target, handler)
proxy.a = 'a' //prints 'set'
console.info(proxy.a); // prints 'get'
// <- undefined
我试图了解 Javascript Proxy
API,并决定自己尝试一些代码。我已经定义了一个空目标和一个带有 set 和 get 陷阱的处理程序。我的设置和获取陷阱工作得很好,每次我设置或获取属性时都会调用它们。但最后一个 console.info 语句打印出未定义的内容。我发现的唯一修复方法是在 set 陷阱中的 return 语句上方添加一个 target[key] = value;
。但我很确定这是不正确的。谁能帮我弄清楚为什么我不能在这里使用代理设置属性?提前致谢:)
最佳答案
The only fix I found is to add a
target[key] = value
; just above the return statement in the set trap. But I'm pretty sure that's not correct.
事实上,这是正确的。 standard没有提到当 set
trap 返回 true 时自动设置属性值。相反,返回值被视为设置操作成功的标志。
您可以从处理程序返回false
,但仍以正常(或任何)方式增强属性。在非严格模式下甚至无关紧要,目标将像往常一样获得更新。然而在严格模式下,会出现blood TypeError:
未捕获类型错误:代理上的“设置”:陷阱返回属性错误...
您可能对相关 MDN page 中给出的这个示例感到困惑:
var p = new Proxy({}, {
set: function(target, prop, value, receiver) {
console.log('called: ' + prop + ' = ' + value);
return true;
}
});
p.a = 10; // "called: a = 10"
看,如果您直接在控制台中计算此值,'叫:a = 10'
将立即跟随 10
打印。但这个输出只是 p.a = 10;
语句的结果,仅此而已。当您将 p.a;
行附加到此代码时,您还会看到 undefined
- 同样,该代码没有修改该属性。
关于Javascript |代理| Handler.get() 方法未设置目标对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42741405/