gpt4 book ai didi

Javascript |代理| Handler.get() 方法未设置目标对象属性

转载 作者:太空宇宙 更新时间:2023-11-04 15:55:30 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com