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

标签 javascript reflection

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/

相关文章:

javascript - 逐行读取文本文件并使用数据进行输入

javascript - 使用商和提醒的二进制加法算法

java - 将未知对象转换为适当的 Method.invoke 参数的有效方法?

c# - 如何从封闭类型的 MethodInfo 获取开放泛型类型的 MethodInfo

c# - .NET 中的动态类初始化

javascript - JS Promise - 返回一些结果而不解决 promise

javascript - 如何制作动态名称选择器(无限)

javascript - 使用 JS 更改文本选择突出显示

c# - 我将如何使用反射来调用具有特定自定义属性的所有方法?

java - 确定字段的访问级别