2016-10-31 135 views
1
在JS

伊夫对象使用相同的功能

var myobj = {} 

我需要每一个你叫方法方法就像myObj.a()myObj.b()时间等它会调用到相同的功能和将不会呼叫任何其他的东西...

like myFn = function(){ 
return 1 + 1 ; 
} 
+0

你为什么要这么做? – Lew

+3

[代理](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Proxy)将是完美的。 – ste2425

+0

@ ste2425 - 你能举个例子吗 –

回答

4

好的,所以代理是一种选择。

这是ES6,我不相信它可以pollyfilled所以没有IE支持,我很害怕。正如你所说那不是一个问题,那么一切都很好。

var obj = {}; 

var objProxied = new Proxy(obj, { 
    get: (target, key, reciever) => { 
    console.log(`Handler hit, looking for prop ${key}`); 
    return (...args) => foo(...args); // return what ever you like here 
    } 
}); 

本质上它是如何工作的是你提供代理与被代理的对象和处理程序的映射。 MDN列出了所有不同的处理程序,如果你不提供处理程序,那么它会调用该对象。

根据处理程序的类型,您的处理程序提供了不同的东西。在我们的情况下,get接收其被调用的对象,原始obj和属性名称。

重要的是要注意你的处理程序必须返回一个值(如果注释在示例中),如果你不这样做,它会调用底层对象。这会在我们的示例中导致异常,因为我们会尝试执行未定义的方法。

MDN

在行动:

var obj = {}; 
 

 
function foo(...args) { 
 
    console.log('foo called With:', ...args); 
 
} 
 

 
var objProxied = new Proxy(obj, { 
 
    get: (target, key, reciever) => { 
 
    \t console.log(`Handler hit, looking for prop ${key}`); 
 
    return (...args) => foo(...args) 
 
    } 
 
}); 
 

 
objProxied.a(10); 
 
objProxied.b(20, 50);

+0

想出一个伟大的ES6解决方案的荣誉! – Roberrrt

+1

为什么不使用jsfiddle而是使用堆栈片段? –

+0

@FelixKling因为我更喜欢'JSFiddle'进行原型设计,所以它已经在我的浏览器中打开了,老实说,并不完全知道如何在SO中添加一个。 – ste2425