我正在通过 Google Chrome 版本 57.0.2987.133 运行以下脚本:
当运行时,我看到处理程序的get陷阱被调用以返回Map的set函数,然后我收到以下错误:
var loggingProxyHandler = {
"get" : function(targetObj, propName, receiverProxy) {
let ret = Reflect.get(targetObj, propName, receiverProxy);
console.log("get("+propName.toString()+"="+ret+")");
return ret;
},
"set" : function(targetObj, propName, propValue, receiverProxy) {
console.log("set("+propName.toString()+"="+propValue+")");
return Reflect.set(targetObj, propName, propValue, receiverProxy);
}
};
function onRunTest()
{
let m1 = new Map();
let p1 = new Proxy(m1, loggingProxyHandler);
p1.set("a", "aval"); // Exception thrown from here
}
onRunTest();
NOTE: Requires a browser supporting ES2015's Proxy
"Uncaught TypeError: Method Map.prototype.set called on incompatible receiver [object Object]"
at Proxy.set (native)
...
我尝试从loggingProxyHandler中删除陷阱函数(使其成为空对象),但仍然收到相同的错误。
我的理解是,代理对象应该能够为所有本地ES5和ES2015 JavaScript对象生成。在相同的代理处理程序下,数组似乎工作得很好。
我是否误解了规范?
我的代码是否缺少某些内容?
Chrome中是否存在已知的错误?(我进行了搜索,没有找到关于此主题的Chrome缺陷。)
set
和get
调用,而不是通过代理路由所有属性访问? - BergiProxy
来拦截超出正常Object
语义的奇特行为。请改用子类化。 - user6445533