Javascript 代理服务器未按预期工作

Javascript 代理服务器未按预期工作,javascript,oop,object,Javascript,Oop,Object,最近,我一直在尝试学习javaScript中的元编程。但是,这个脚本编写 false true 当我希望控制台写入true两次时: var foo=newproxy({x:20,y:20}{ has:功能(目标、道具){ console.log(target.hasOwnProperty(prop))//false if(target.hasOwnProperty(prop)){ 返回true; } return false;//是否返回??? } }); console.log('toSt

最近,我一直在尝试学习javaScript中的元编程。但是,这个脚本编写

false
true
当我希望控制台写入
true
两次时:

var foo=newproxy({x:20,y:20}{
has:功能(目标、道具){
console.log(target.hasOwnProperty(prop))//false
if(target.hasOwnProperty(prop)){
返回true;
}
return false;//是否返回???
}
});

console.log('toString'在foo中)//true
我得到了
false
两次

var foo=newproxy({x:20,y:20}{
has:功能(目标、道具){
console.log(target.hasOwnProperty(prop))
if(target.hasOwnProperty(prop)){
返回true;
}
返回false;
}
});
console.log(foo中的“toString”);

log('x'在foo中)
好吧,Safari向您显示
false
然后
true
确实很有趣。(我可以验证它是否也向我显示,在iOS v11.2.6上的iOS Safari中,中的
使用抽象操作,它使用您使用它的对象的[[HasProperty]]内部操作(在您的情况下,是代理)。如果处理程序返回
false
,则do允许结果与处理程序返回的结果不同,但会发生这种情况的附加检查不适用于代码。特别是:如果属性作为“自有”属性存在于目标上,并且1)该属性不可配置,或者2)该对象不可扩展,则不允许
has
处理程序说该属性不存在。您的目标对象没有自己的
toString
属性,因此这不适用。所以看来Safari的检查可能有点错误。查看快照规范ES2015、ES2016和ES2017,自引入代理以来,这种行为没有改变

FWIW,它应该输出两次
false
,因为:

  • target
    没有其名为
    toString
    own属性(它从
    Object.prototype
    继承),因此
    console.log(target.hasOwnProperty(prop))正确显示
    false

  • 因为您的代理返回
    hasOwnProperty
    的结果(有些间接),所以
    console.log('toString'在foo中)也正确显示
    false

如果您只想让
has
执行其正常行为,最好的方法可能是使用:

var foo=newproxy({x:20,y:20}{
has:功能(目标、道具){
var flag=Reflect.has(目标、道具);
console.log(标志);//true
返回标志;
}
});

console.log('toString'在foo中)//true
Vanilla Safari,10.1.2,除了禁用的Flash和Java之外,没有扩展。我觉得这意味着我在某种程度上被欺骗了,因为我收到了两张反对票,我认为这是一个完全合法的问题。我可以证实,在iOS v11上的Safari中也发生了这种情况。现在这很有趣。FWIW,我已经更新了我的答案,详细说明了应该发生什么。据我所知,Safari不允许您为该属性返回
false
,这是错误的。