2012-04-10 72 views
1

請考慮以下JavaScript代碼。函數定義似乎都達到了同樣的效果。有沒有推薦的約定來定義函數,然後在返回的字典對象中「顯示」?推薦在javascript模塊中確定私人成員的方法

var testModule = (function(){ 
     var counter = 0; 

     var localFunc1 = function() { 
     return "local 1"; 
     } 

     function localFunc2() { 
     return "local 2"; 
     } 

     this.localFunc3 = function() { 
     return "local 3"; 
     } 

     localFunc4 = function() { 
     return "local 4"; 
     } 

     return {  
     proxy1: localFunc1, 
     proxy2: localFunc2, 
     proxy3: localFunc3, 
     proxy4: localFunc4 
     }; 
    })(); 
+1

推薦的方法是不要這樣做。私有是不值得的麻煩 – Raynos 2012-04-10 14:37:55

+1

私有是建立圖書館代碼必不可少的。 – Deestan 2012-04-10 14:48:25

回答

2

我不認爲有任何真正的首選方法。我見過的最常見的設置包括將所有方法創建爲local(使用var),然後返回公開方法的對象。

幾件事情需要注意:

  • this.localFunc3只會工作,如果你的對象是使用new關鍵字實例化
  • 返回你的對象時,刪除()從每個功能,所以您返回函數的引用,而不是函數的返回值
  • localFunc4將是全球性的,因爲它在它的前面沒有「變種」關鍵字

工作時有了這樣的模塊模式,我傾向於去的線沿線的東西:

var Obj = (function() { 
    var private_static = 'this value is static'; 
    return function() { 
     //-- create return object 
     var _self = {}; 
     //-- create private variables 
     var private_variable = 'this value is private'; 
     var func1 = function() { 
      return 'value 1'; 
     }; 
     //-- attach public methods 
     _self.func1 = func1; 
     //-- return the object 
     return _self; 
    }; 
})(); 

的一些注意事項有關此方法:

  • 允許私有靜態變量(如果你不需要私人靜態變量,你可以先創建_self引用刪除關閉)
  • ,你可以傳遞一個自我引用之內,從實例化的任何對象都需要他們的父母參考
  • 我喜歡,我可以引用所有內部功能沒有_s小精靈。無論這個或哪個,無論他們是否私密或公開
+0

我檢查了這個,localFunc3沒有使用新的工程。你可否確認? – jaffa 2012-04-10 15:06:32

+0

@Robert,''new','this'將指向窗口。這就是他的'localFunc3'工作的原因。 – bfavaretto 2012-04-10 17:54:30

+0

啊,是的,我的錯誤。刪除了我有缺陷的解釋。 =) – 2012-04-10 18:37:20

1

這些定義並沒有達到完全相同的效果。

  • var localFunc1function localFunc2做同樣的事情,他們創造功能只適用你的外部函數中。

  • this.localFunc3localFunc4是不是真的局部功能:它們都屬於window對象(在這種情況下thiswindow,而localFunc4是沒有var語句聲明)。

因此,後兩者甚至不需要暴露在返回的對象上,因爲它們已經是全局的。而且,實際上,您不會在您的返回對象上公開任何函數,因爲您調用了它們中的每一個函數,所以您將公開它們的返回值。你是否想要這樣做?

return {  
    proxy1: localFunc1, 
    proxy2: localFunc2, 
    proxy3: localFunc3, 
    proxy4: localFunc4 
}; 

注意:我建議你看this video其中道格拉斯克羅克福德解釋了多種方式來處理在JavaScript中繼承。我相信你正在尋找他所謂的「寄生傳承」。

+0

不,你是對的。返回的代理應該指向函數而不是它們的返回值。謝謝你選擇這個。我更新了代碼以反映這一點。 – jaffa 2012-04-10 15:01:07

+0

我調試了代碼,看起來localFunc3和localFunc4不在窗口對象上。你能證實這一點嗎?這是不是因爲testModule由於是自調用函數而確定了'this'範圍? – jaffa 2012-04-10 15:05:57

+0

@jaffa,'this'應該是'window',除非你的對象是用'new'實例化的。參見[示例](http://jsfiddle.net/NuV9R/)。 – bfavaretto 2012-04-10 15:40:00