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上。
答案 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();