2012-06-10 16 views
9

JavaScriptプロジェクトの名前空間を作成すると他のライブラリとの競合を減らすことができます。私はコンストラクタ関数を定義した多くの異なるタイプのオブジェクトを持つコードをいくつか持っています。これらを名前空間の中に入れるのは良い習慣ですか?例えば名前空間内のコンストラクタ

var square = new shapes.Rectangle(10,10); 
+3

を私は、 –

+0

機能であなたのコンストラクタ、良いアイデアだと思います'関数Rectangle(w、h){}'を書くのではなく、 "名前空間"のオブジェクトプロパティに割り当てる場合には、関数宣言*の代わりに*関数式*になります。これには少し違いがあります:https://developer.mozilla。org/de/docs/Web/JavaScript/Reference/Functions他にも指摘されているように、それ以外のグローバルな名前空間は汚染されません。 – caw

答えて

4

この名前空間は "Singleton pattern"と呼ばれ、有名な "Gang of Four"デザインパターンブックに薦める主要なパターンの1つです。 1 がない場合は古典的には、Singletonパターンは、クラスの新しいインスタンスを作成する方法と クラスを作成することで実現できる

:偉大な(そして無料)ブックLearning JavaScript Design Patternsから

存在する。インスタンスが既に存在する場合は、単に がそのオブジェクトへの参照を返します。したがって、シングルトンパターンはクラスのインスタンス化を1つのオブジェクトに制限するため、 と呼ばれます。

JavaScriptでは、シングルトンは 実装コードをグローバル名前空間から分離して、機能のための単一アクセスポイント を提供する名前空間プロバイダとして機能します。だから、

彼らは多くの異なる形態を取ることができますが、その最も基本的で、 シングルトンが一緒に その関連する関数およびプロパティを持つグループ化されたオブジェクトリテラルとして実装することができ

...

はいそれは、多くのプログラミング言語でよく使われているコンセプトであり、JavaScriptのグローバル名前空間オブジェクトの衝突を防ぐのに最適です。

も参照してください:あなたがグローバルな名前空間を汚染に起因する手間や混乱を避けるためSimplest/Cleanest way to implement singleton in JavaScript?

+1

素晴らしいどうもありがとう。リンクにも感謝します。ネームスペース内の関数に対して 'new'と呼んでいる人の例は見たことがなく、その理由があるのか​​疑問に思っていました。 – Joe

+0

私が考えることができる理由はありません。新しい関数はJavaScriptのプロトタイプ継承であり、実際にはより多くのクラスに似た継承としてよく使用されます。ほとんどの例では、ただ一つの "クラス"しか定義していませんが、それらの束を整理しようとしているのであれば、シングルトンパターンはそれほど役に立ちません。 – buley

+2

@joeもちろん、オブジェクトリテラルにコンストラクタが含まれているとシングルトンパターンとはみなされません;-) –

2

はい:介して呼び出すことができる

var shapes = { 
    Rectangle: function(w, h) { 
     this.width = w; 
     this.height = h; 
    } 
}; 

2

ええ、それは、良い考えです。私は個人的にはshapesshapeに変更していますが、shape.Rectangleを使用すると、少しわかりやすくなります(結局、Rectangleは1つのオブジェクトにすぎません)。

1

名前空間を汚染しないだけでなく、それはまた、あなたはタイプの家族のチェックを行うことができます

function doSomethingTo(shape) { 
    var shapeName, validArg; 

    for (shapeName in shapes) { 
    validArg = validArg || shape instanceof shapes[shapeName]; 
    } 

    if (!validArg) throw "Argument is not a shape."; 
} 
5

これは一般的に良いアイデアです。あなたのオブジェクトは、モジュールのように、クロージャ内でそれらすべてをラップすることができます公開すべきではないの共有機能のセットが必要な場合は別途、:

var shapes = (function() { 
    // private variables 
    var foo = 0; 

    // private function 
    function get_area(w, h) 
    { 
    return w * h; 
    } 

    return { 
    Rectangle: function(w, h) { 
     this.width = w; 
     this.height = h; 
     // call private function to determine area (contrived example) 
     this.area = get_area(w, h); 
    } 
    } 
}()); 

var s = new shapes.Rectangle(100, 5);