web-dev-qa-db-ja.com

Javascript:モジュールパターンvsコンストラクター/プロトタイプパターン?

モジュールパターンまたはConstructor/protoTypeパターンが私の作業により適しているかどうかを知りたいです。

基本的に、目立たないjavascriptを使用しています。HTMLドキュメントには.jsファイルへの参照が含まれています。

モジュールパターンの私の理解:

  • INITメソッドを呼び出します(これは基本的に、モジュールパターンを使用して作成して返すことができるパブリックメソッドです)
  • INITメソッドで、すべてのクリックイベントなどを割り当てます。

これは、オブジェクトや継承階層などを作成する必要がないため、私の状況に最適なパターンのように聞こえます。

コンストラクター/プロトタイプパターンの私の理解:

  • オブジェクト作成用
  • 継承を使用する(スーパータイプのサブタイプ)

控えめなjavascriptを提供するために、モジュールパターンが理想的であることは正しいですか?

73
Martin

コンストラクター関数とプロトタイプは、クラスとインスタンスを実装する合理的な方法の1つです。それらはそのモデルに完全には対応していないため、通常、プロトタイプの観点からクラスを実装するには、特定のスキームまたはヘルパーメソッドを選択する必要があります。 ( JSのクラスの背景 。)

モジュールパターンは通常、ネームスペースに使用されます。この場合、関連する関数とオブジェクトをグループ化するストアとして機能する単一のインスタンスがあります。これは、プロトタイピングの利点とは異なるユースケースです。彼らは実際には互いに競合していません。両方を一緒に使うこともできます(たとえば、モジュール内にコンストラクタ関数を入れてnew MyNamespace.MyModule.MyClass(arguments)と言います)。

68
bobince

モジュールパターンは、プロトタイプよりもはるかに簡単でエレガントです。ただし、モバイルを最初に考えます。初期化では、開始する前にブロック全体を解析する必要があるため、中規模/大規模オブジェクトには関連するパターンではありません。また、複数のクロージャーは、ガベージコレクターが解放しない循環依存関係(特にIE)を作成し、ウィンドウ(またはタブ)が閉じられるまで解放されない重いメモリフットプリントになります-check chrome task比較するマネージャー-ロード時間はモジュールパターンを使用してオブジェクトサイズに反比例しますが、これはプロトタイプ継承の場合ではありません。上記のステートメントは、次のような複数のベンチマークを通じて検証されます。 http://jsperf.com/プロトタイプ性能/ 54

最後のテストで見たように。小さなオブジェクトは、(これらのパターンなしで)プレーンオブジェクトとして初期化される方が良いでしょう。クロージャも継承も必要としない単一のオブジェクトに適しています。これらのパターンが必要かどうかを評価するのが賢明です。

12
Yann VR

折りたたみパターンを試すことができます。リンクは次のとおりです。 Javascript折りたたみパターン

また、折りたたみパターンの使用方法を示す同様の質問への回答も残しました。

折りたたみパターンの簡単な例

5
intrepidis

プロトタイプパターンは、機能を拡張するのに役立ち、オブジェクトの数に関係なく、メモリには関数のインスタンスが1つしかありません。 Moduleパターンでは、各オブジェクトはメモリ内に関数の新しいインスタンスを作成しますが、プライベート/パブリック変数の概念を提供し、変数と関数をカプセル化するのに役立ちます。

4
user1662008