9

I have read that creating a namespace for JavaScript projects helps to reduce conflicts with other libraries. I have some code with a lot of different types of objects for which I have defined constructor functions. Is it good practice to put these inside the namespace as well?

For example:

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

which can be called via:

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

5 に答える 5

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);
于 2012-06-10T16:38:56.903 に答える
4

この名前空間は「シングルトン パターン」と呼ばれ、有名な「ギャング オブ フォー」デザイン パターンの本で推奨されている主要なパターンの 1 つです。

偉大な (そして無料の) 本Learning JavaScript Design Patternsから:

従来、Singleton パターンは、クラスのインスタンスが存在しない場合に新しいインスタンスを作成するメソッドを使用してクラスを作成することで実装できます。インスタンスがすでに存在する場合は、そのオブジェクトへの参照を返すだけです。Singleton パターンは、クラスのインスタンス化を単一のオブジェクトに制限するため、このように知られています。

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

それらはさまざまな形式をとることができますが、最も基本的なものとして、Singleton は、関連する関数とプロパティと共にグループ化されたオブジェクト リテラルとして実装できます...

そうです、これは多くのプログラミング言語でよく使用される概念であり、JavaScript でグローバルな名前空間オブジェクトの衝突を防ぐのに最適です。

参照: JavaScript でシングルトンを実装する最も簡単でクリーンな方法は?

于 2012-06-10T16:32:09.630 に答える
2

ええ、それは良い考えです。なぜなら、グローバル名前空間を汚染することによって引き起こされる煩わしさや混乱を避けることができるからです。私は個人的には に変更shapesshapeますが、その場合は を使用できますshape.Rectangle。これは、私にはもう少し理にかなっています (結局のところ、Rectangle は 1 つのオブジェクトにすぎません)。

于 2012-06-10T16:32:41.370 に答える
2

はい。グローバル名前空間を可能な限り汚染しないようにする必要があります

于 2012-06-10T16:30:30.717 に答える
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.";
}
于 2012-06-10T16:37:22.137 に答える