为什么我的Proxy包装Map的函数调用抛出TypeError?

时间:2017-02-22 01:23:34

标签: javascript ecmascript-6

var cache = new Proxy(new Map(), {
    apply: function(target, thisArg, argumentsList) {
        console.log('hello world!');
    }
});

cache.set('foo', 'bar');

据我所知,应该导致hello world!被记录到控制台并且Map foo密钥未被设置。但是,当我运行它时,它会抛出:

TypeError: Method Map.prototype.set called on incompatible receiver [object Object]
    at Proxy.set (native)
    at repl:1:7
    at ContextifyScript.Script.runInThisContext (vm.js:23:33)
    at REPLServer.defaultEval (repl.js:340:29)
    at bound (domain.js:280:14)
    at REPLServer.runBound [as eval] (domain.js:293:12)
    at REPLServer.onLine (repl.js:537:10)
    at emitOne (events.js:101:20)
    at REPLServer.emit (events.js:189:7)
    at REPLServer.Interface._onLine (readline.js:238:10)

我已经多次使用Google搜索并查看了所有MDN代理文档,但我无法理解为什么这不起作用。

有什么想法吗?我在Node.js 7.5.0上。

1 个答案:

答案 0 :(得分:2)

apply陷阱调用(如果你代理一个函数),而不是方法调用(只是属性访问,调用和一些this恶作剧)。您可以提供get并返回一个函数:

var cache = new Proxy(new Map(), {
    get(target, property, receiver) {
        return function () {
            console.log('hello world!');
        };
    }
});

我不认为你只是试图覆盖Map的部分内容?在这种情况下你可以从它的原型继承(如果它是一个选项,这是一个比代理更好的选择):

class Cache extends Map {
    set(key, value) {
        console.log('hello world!');
    }
}

const cache = new Cache();