2010-01-20 32 views
4

project我對我的工作正在構建我的代碼如下在JavaScript命名空間技術,建議?高性能?需要注意的問題?

MyLib = { 
    AField:0, 

    ASubNamespace:{ 
     AnotherField:"value", 

     AClass:function(param) { 
      this.classField = param; 

      this.classFunction = function(){ 
       // stuff 
      } 
     } 
    }, 

    AnotherClass:function(param) { 
     this.classField = param; 

     this.classFunction = function(){ 
      // stuff 
     } 
    } 
} 

等一樣,做的東西,如:

var anInstance = new MyLib.ASubNamespace.AClass("A parameter."); 

這是去實現命名空間的正確方法?是否有性能點擊,如果是的話,有多激烈?當我嵌套更深時,性能下降是否會疊加?使用這種結構時,我應該注意哪些其他問題?

我關心每一點性能,因爲它是一個實時圖形庫,所以我非常重視任何開銷。

+1

[必備JS設計模式一書(http://addyosmani.com/resources/essentialjsdesignpatterns/book/#detailnamespacing)含有關於命名空間模式的章節。 – hellectronic 2012-08-16 10:09:50

回答

4

當你組織你的代碼作爲一個大巨頭對象的屬性層級,你有時不得不問題,其中MyNamespaceObj.prop1不可用MyNamespaceObj.prop2呢。然後有一個事實是,你通常最終會在代碼中輸入完全限定的名字。

我開始發現我喜歡做這樣的事情:

MyNamespaceObj = (function() { 

    // lots of code/definitions that have local scope 
    var internallyDefinedItem1 = function (n) { /* ... */ } 
    var internallyDefinedItem2 = { 
     foo: internallyDefinedItem1(532), 
     bar: totallyPrivateNeverExportedFunction(17) 
    } 
    var totallyPrivateNeverExportedVar = 'blahblahblah'; 
    function totallyPrivateNeverExportedFunction (x) { 
     /* ... */ 
    } 

    return { 
     exportedItem1: internallyDefinedItem1, 
     exportedItem2: internallyDefinedItem2, 
     ... 
    } 
})(); 
+0

我在開發項目時發現,在最初需要這個問題的時候,任何事情都是完全私有的,對於調試是非常不利的,因爲在運行時獲取這些值是一種痛苦。 – Bjartr 2010-06-30 12:53:57

+0

這就夠了。我主要是通過編寫在調試時將運行時間值記錄到控制檯的函數(並將它們排除出去)來解決這個問題,但肯定令人惱火的是,在某些調試器中很難設置表達式的監視本地範圍有限。不過,我認爲這主要是工具的弱點,而不是技術上的弱點。希望隨着時間的推移解決問題。 – 2010-06-30 17:42:45

5

我建議命名空間是編寫可維護的JavaScript的一個重要組成部分 - 尤其是如果你有一個團隊的開發工作。

相關的命名空間的性能問題應該不大,如果你compress/minimize your code的方式來生產。

這裏是一個另類的方式來使用命名空間an SO discussion

2

命名空間JavaScript是至關重要的,以避免潛在的衝突和覆蓋。當你的JS會在外部JS也可以駐留的外部環境中登陸時,情況就是如此。這就是說,由於命名空間的原因,性能受到影響,只是因爲解釋器現在必須遵循更長的鏈才能訪問所需的函數/屬性。相比

例如,像

var myProperty; 

訪問更快一點:

myNameSpace.module1.myProperty; 

我想除非你命名空間極其深刻的速度差異並不多和優勢避免潛在的衝突是命名空間的一大優點。

但儘管如此,它始終是很好的保持這個問題的初衷。