Spidermonkey拥有代理对象的invoke
处理程序。我可以做类似的事情:
let o = { foo () {} };
let x = Proxy(o, { invoke: function () { console.log('method invoked!'); } });
x.foo(); // logs 'method invoked'
这是否与ES6等效?在规范中找不到它。
答案 0 :(得分:0)
简短回答:否。
啊哈! invoke
陷阱的另一个提议者:)这与ES6规范有相当多的历史。最后一次战争发生在this ESDiscuss thread,这基本上总结了TC总体感觉为什么invoke
没有达到ES6规范。 tl;该线程的dr是:handler.invoked === handler.get + handler.call
,所以最好不要添加另一个破坏等价的陷阱。
所以更长的答案就是一起使用handler.get
和handler.call
。
// pseudo code for handler object
handler = {
...
get (key, o) {
if (Reflect.get(o, key) === 'function') {
return handler.invoke(key, o);
}
...
},
invoke (key, o) {
...
},
...
}
如果方法尚未定义,这显然不起作用,所以如果你想抓住o.arbitraryFuncCall()
,真的没办法:(