我正在通过谷歌的Chrome版本57.0.2987.133以下脚本:为什么是代理在ES2015一个Map对象不工作
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
运行时,我看到了处理器的get陷阱被称为返回地图的设定功能 然后我收到以下错误:
"Uncaught TypeError: Method Map.prototype.set called on incompatible receiver [object Object]"
at Proxy.set (native)
...
我试过removin g loggingProxyHandler中的陷阱函数(使其成为空对象),但仍然收到相同的错误。
我的理解是,代理对象应该能够为所有原生ES5和ES2015 JavaScript对象生成。数组似乎在相同的代理处理程序下工作良好。 我误解了规格吗?
我的代码丢失了什么? Chrome中有没有已知的错误? (我做了搜索,发现Chrome的无缺陷对这个问题)。
的可能重复[?为什么我的代理,它包装一个地图的函数调用抛出类型错误](http://stackoverflow.com/questions/42381028/why-is-这听起来像你实际上想要做的就是覆盖(拦截)set和get调用,而不是路由所有的*属性访问*通过(通过代理包装的一个映射函数调用抛出typeerror) – Bergi
一个代理? – Bergi
要说清楚:不要使用'Proxy'来拦截异常行为,这超出了正常的'对象'语义。改为使用子类。 – ftor