ES6蜘蛛猴代理对象的method.invoke相当于什么?

时间:2015-10-31 06:43:38

标签: javascript ecmascript-6

Spidermonkey拥有代理对象的invoke处理程序。我可以做类似的事情:

let o = { foo () {} };
let x = Proxy(o, { invoke: function () { console.log('method invoked!'); } });
x.foo(); // logs 'method invoked'

这是否与ES6等效?在规范中找不到它。

1 个答案:

答案 0 :(得分:0)

简短回答:否。

啊哈! invoke陷阱的另一个提议者:)这与ES6规范有相当多的历史。最后一次战争发生在this ESDiscuss thread,这基本上总结了TC总体感觉为什么invoke没有达到ES6规范。 tl;该线程的dr是:handler.invoked === handler.get + handler.call,所以最好不要添加另一个破坏等价的陷阱。

所以更长的答案就是一起使用handler.gethandler.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(),真的没办法:(