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

时间:2017-03-11 22:29:09

标签: 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 trap中的return语句上方添加target[key] = value;。但我很确定这不正确。任何人都可以帮我弄清楚为什么我不能在这里使用代理设置属性?在此先感谢:)

1 个答案:

答案 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 - 同样,代码也没有修改该属性。