2009-10-09 15 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(新しい質問はより明確です) –

答えて

5

実際には、すべての意味論についてです。コードを分割して複数のファイルを分割し、一般的な名前空間を利用する予定がある場合は、次のようにしてください。

私がこの方法を享受する理由は、はるかにモジュール化されており、複数のファイルに分割して、依存関係の問題なしに簡単に1つに圧縮することができます(名前空間の関数が別のものに依存しない限り)。

誤って使用されると、 - 私は何にも当てはまると思う。

GUI.js:いくつかの実用的なアプリケーションは次のようになり

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

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

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

名前空間を使用しているあなたの他のJavaScriptファイルで

あなたの名前空間ファイルで

var Namespace = {}; 

// 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"のどちらにも到達できません。 –

+0

彼はおそらくそれについて考えなかった:)あなたは間違っている、publicとpublic_funcはNamespace.stuff.publicとNamespace.stuff.public_functを介して到達可能である。 感謝ジャスティン、私はあなたの方法が一番好きです。 Timもありがとう、あなたの例は他のパターンと組み合わせることができ、便利です。 –

0

これは良いことですが、1つのオブジェクトprivを使用する代わりに、名前空間のローカル変数としてプライベート変数を宣言する方が良いです。利点:コードが少なくて、パッカーは変数名を縮小する可能性があります。ここにコードをパックしてみてください:http://dean.edwards.name/packer/

0

あなたの例はちょうどいいと思いますが、この全体的な質問は主に味に関するものです。しかし、私はこのように書くwourld:ダグラス・クロックフォードは示唆し、YAHOOから見たように、すべての

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); 
     } 
    })() 
} 

まず、名前空間は、すべてのupercaseでなければなりません。

第2に、匿名関数ではなく、直接そのプロパティを持つNAMESPACEを作成します。しかし、私は無名関数内にpublicFunction1関数を作成しました。私はprivate関数とその中の変数を定義することができます。あなたの例ではスコープがさらに小さくなっているので、これは少し異なります。利点は、同じ名前空間内の他の関数が同じ変数名を使用できることです。欠点は、よく、他の関数はその関数と同じ変数を共有していない:-)