2016-10-31 172 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