我正在通過谷歌的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