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 trap中的return语句上方添加target[key] = value;
。但我很确定这不正确。任何人都可以帮我弄清楚为什么我不能在这里使用代理设置属性?在此先感谢:)
答案 0 :(得分:1)
我找到的唯一解决方法是添加
target[key] = value
;就在设置陷阱中的return语句之上。但我很确定这不正确。
实际上,这是正确的。 set
陷阱返回true时,standard没有提及自动设置属性值。相反,返回值被视为设置操作正常的标志。
您可以从处理程序返回false
,但仍然以正常(或任何)方式扩充属性。在非严格模式下甚至不重要,目标将像往常一样获得更新。但是,在严格模式下,会有 blood TypeError:
Uncaught TypeError: 'set' on proxy: trap returned falsish for property...
您可能会对相关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"
请参阅,如果您直接在控制台中对此进行评估,'called: a = 10'
将紧跟10
打印。但是这个输出只是p.a = 10;
语句的结果,仅此而已。当您将p.a;
行附加到此代码时,您也会看到undefined
- 同样,代码也没有修改该属性。