2017-02-22 123 views
1
var cache = new Proxy(new Map(), { 
    apply: function(target, thisArg, argumentsList) { 
     console.log('hello world!'); 
    } 
}); 

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

至于我可以告诉这个应该结果hello world!被记录到控制台和地图的foo键未被设置。然而,当我运行它,它抛出:为什么我的代理包装Map函数会调用TypeError?

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

什么是你真正想实现什么?你能否创建一个'Map'的子类?例如,你可以在子类中重写'.set()'。 – jfriend00

+0

@ jfriend00耶,重写'.set'是我最初的想法。我使用代理服务器的唯一原因是因为这个项目是教育性的,我想尝试新的闪亮:D – strugee

+0

'应用'陷阱用于调用函数对象,并且不会在“Map”对象上工作(不可调用)。 – Bergi

回答

2

apply陷阱调用(如果您是代理函数),而不是方法调用(这只是属性访问,调用和一些this shenanigans)。你可以提供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(); 
+0

ooooohhhh。谢谢!这真的让我感到厌烦。正如我在下面说的OP我只是想覆盖'.set' - 我知道代理是矫枉过正,但它是一个教育项目,所以我决定使用它“因为”:) – strugee

相关问题