Javascript | Proxy | Handler.get()方法未设置目标对象属性 var target={} 变量处理程序={ 获取(目标、关键){ console.info('get') 返回目标[键] }, 设置(目标、键、值){ console.info('set')) 返回真值 } } var proxy=新代理(目标,处理程序) proxy.a='a'//打印'set' console.info(proxy.a);//打印“获取” //

Javascript | Proxy | Handler.get()方法未设置目标对象属性 var target={} 变量处理程序={ 获取(目标、关键){ console.info('get') 返回目标[键] }, 设置(目标、键、值){ console.info('set')) 返回真值 } } var proxy=新代理(目标,处理程序) proxy.a='a'//打印'set' console.info(proxy.a);//打印“获取” //,javascript,reflection,Javascript,Reflection,我找到的唯一修复方法是添加一个target[key]=value;就在set陷阱中return语句的上方。但我很确定这是不对的 事实上,这是正确的。当settrap返回true时,没有提到自动设置属性值。相反,返回值被视为设置op正常的标志 您可以从处理程序返回false,但仍然以正常(或任何)方式扩充属性。在非严格模式下,目标将像往常一样获得更新。但是,在严格模式下,会出现血型错误: Uncaught TypeError:代理上的“set”:陷阱为属性返回了falsish… 您可能会被以下相

我找到的唯一修复方法是添加一个
target[key]=value
;就在set陷阱中return语句的上方。但我很确定这是不对的

事实上,这是正确的。当
set
trap返回true时,没有提到自动设置属性值。相反,返回值被视为设置op正常的标志

您可以从处理程序返回
false
,但仍然以正常(或任何)方式扩充属性。在非严格模式下,目标将像往常一样获得更新。但是,在严格模式下,会出现血型错误:

Uncaught TypeError:代理上的“set”:陷阱为属性返回了falsish…


您可能会被以下相关信息中给出的示例所迷惑:


请参阅,如果您直接在控制台中对此进行评估,
'called:a=10'
后面将紧跟着
10
print。但是这个输出仅仅是
p.a=10的结果语句,仅此而已。当你追加
p.a行到该代码,您会看到
未定义
,并且,代码没有修改属性。

感谢您的澄清!!我看了这个页面,上面说“所有陷阱都是可选的。如果没有定义陷阱,默认行为是将操作转发到目标。”。如果我要正确理解它,如果我真的定义了一个集合陷阱,我必须确保目标对象是自己扩充的,当我选择根本不定义集合陷阱时,它将假设默认行为并将操作转发给目标。
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
var p = new Proxy({}, {
  set: function(target, prop, value, receiver) {
    console.log('called: ' + prop + ' = ' + value);
    return true;
  }
});

p.a = 10; // "called: a = 10"