2009-10-09 72 views
5

我目前使用下面的模式在JavaScript創建命名空間和單一對象:的Javascript:命名空間

var Namespace = function() { 

    var priv = { 
     privateVar1: '', 
     privateVar2: '', 
     privateFunction1: function() { 
      //do stuff 
      [...] 
     }, 
     [...] 
    }; 

    var pub = { 
     publicVar1: '', 
     publicFunction1: function() { 
       //do stuff with private functions and variables 
       priv.privateVar1 = priv.privateFunction1(pub.publicVar1); 
      [...] 
     }, 
     [...] 
    }; 

    return pub; 
}(); 

我希望你的想法。有沒有辦法創建你認爲更清潔或更好的命名空間(解釋原因)?

+0

重複:http:// stackoverflow。com/questions/6549629/preferred-technique-for-javascript-namespacing(新問題更清楚) – 2012-06-15 11:28:37

回答

5

實際上,它全部是關於語義的。如果你打破了你的代碼分開多個文件,並計劃利用一般的命名空間,然後做這樣的事情有點容易:

我喜歡這種方法的原因是,它是更多的模塊化,並允許代碼被分解成多個文件,然後就可以很容易地將它們壓縮成一個沒有依賴性問題(除非你的命名空間函數依賴於另一個)

這樣做的缺點是,如果使用不正確,它會感覺有點麻煩 - - 我猜可以應用於任何事情。

在你空間文件

var Namespace = {}; 

在您的其他JavaScript文件使用了命名空間

var Namespace = Namespace === undefined ? {} : Namespace; 

Namespace.stuff = function() { 
    var private = 'foo'; 
    function private_func() { 
    }; 

    this.public = 'bar'; 
    this.public_func = function() { 
    } 
}; 

一些實際的應用是:

GUI.js

// Some general GUI 
var GUI = { 
    'MAX_WIDTH': $(window).width(), 
    'MAX_HEIGHT': $(window).height() 
}; 

Toolbar.js

GUI.Toolbar = function (id) { 
    var self = this; 

    function init_visuals() { 
     $(id).click(function() { 
      self.alert_broken(); 
     }); 
    }; 

    function initialize() { 
     init_visuals(); 
    }; 

    this.alert_broken = function() { 
     alert('Broken!'); 
    }; 

    initialize(); 
}; 

Menu.js

GUI.Menu = function() { 
}; GUI.Menu.prototype = new GUI.Toolbar(); 

現在,單身 - 這就是整個的另一個理由。

+0

我認爲你的例子已經壞了。 「private」和「public」不能用作變量名稱,因爲它們是保留的:http://javascript.about.com/library/blreserved.htm。其次,「public」和「public_func」都不可用。 – 2009-10-09 08:49:47

+0

他可能沒有想到:)你錯了,public和public_func可以通過Namespace.stuff.public和Namespace.stuff.public_funct到達。 謝謝賈斯汀,我最喜歡你的方法。謝謝你,蒂姆,你的例子可以與其他模式相結合,將是有益的。 – 2009-10-09 13:32:39

0

這很好,但更好的是將私有變量聲明爲名稱空間中的局部變量,而不是使用一個對象priv。優點:代碼少,打包機可能縮小變量名稱。嘗試在此處打包代碼:http://dean.edwards.name/packer/

0

我認爲你的例子很好,這個問題主要是關於味道。不過,我wourld寫這樣的:

所有的
var NAMESPACE = { 

    publicVar1: '', 
    publicFunction1: (function(){ 

     var privateVar1 = ''; 
     var privateVar2 = ''; 
     function privateFunction1() { 
      //do stuff 
      //[...] 
     }; 

     return function(){ 
      //do stuff with private functions and variables 
      priv.privateVar1 = priv.privateFunction1(pub.publicVar1); 
     } 
    })() 
} 

首先,命名空間應該是所有大寫在前,像道格拉斯Crockford的建議,並通過雅虎看到。

其次,我直接創建帶有其屬性的NAMESPACE,而不是通過匿名函數。但是我在匿名函數中創建了publicFunction1函數,所以我可以在其中定義私有函數和變量。這有些不同,因爲在你的例子中,範圍更小。好處是,相同名稱空間內的其他函數可以使用相同的變量名稱。缺點是,其他函數不會與該函數共享相同的變量:-)