2012-04-28 12 views
5

に私は、このリンクhttp://addyosmani.com/largescalejavascript/#modpatternカプセル化はjavascriptのモジュールパターン

を読み、次の例を見ました。

var basketModule = (function() { 
var basket = []; //private 

return { //exposed to public 
     addItem: function(values) { 
      basket.push(values); 
     }, 
     getItemCount: function() { 
      return basket.length; 
     }, 
     getTotal: function(){ 
      var q = this.getItemCount(),p=0; 
      while(q--){ 
       p+= basket[q].price; 
      } 
     return p; 
     } 
     } 
}()); 

basketModule.addItem({item:'bread',price:0.5}); 
basketModule.addItem({item:'butter',price:0.3}); 

console.log(basketModule.getItemCount()); 
console.log(basketModule.getTotal()); 

それはどのようにこれは以下のようにそれを書くと異なっているのですか?「のモジュールパターンは 『プライバシー』をカプセル化するパターン、状態及び組織がクロージャを使用して人気のデザインである」という統計単に機能範囲でプライバシーを施行できないのですか?あなたはそれの新しいインスタンスを作成する可能性なしにオブジェクトを作成する最初の変形では

var basketModule = function() { 
var basket = []; //private 
     this.addItem = function(values) { 
      basket.push(values); 
     } 
     this.getItemCount = function() { 
      return basket.length; 
     } 
     this.getTotal = function(){ 
      var q = this.getItemCount(),p=0; 
      while(q--){ 
       p+= basket[q].price; 
      } 
     return p; 
     } 

} 

var basket = new basketModule(); 

basket.addItem({item:'bread',price:0.5}); 
basket.addItem({item:'butter',price:0.3}); 

答えて

3

(それはすぐにインスタンス化機能です)。 2番目の例は完全なコンストラクタ関数であり、いくつかのインスタンスが可能です。カプセル化は両方の例で同じであり、basketアレイは両方とも「プライベート」である。ちょうど楽しみのため

:両方の長所は次のようになります。

var basketModule = (function() { 
    function Basket(){ 
     var basket = []; //private 
     this.addItem = function(values) { 
      basket.push(values); 
     } 
     this.getItemCount = function() { 
      return basket.length; 
     } 
     this.getTotal = function(){ 
      var q = this.getItemCount(),p=0; 
      while(q--){ 
       p+= basket[q].price; 
      } 
     return p; 
     } 
    } 
    return { 
    basket: function(){return new Basket;} 
    } 
}()); 
//usage 
var basket1 = basketModule.basket(), 
    basket2 = basketModule.basket(), 
+0

私は私の質問は今推測は、第二のより多くの「モジュール」第一のパターンです。このリンクでは、モジュールパターンの明示的な例として第1の変種を使用しています。 – eirikrl

+0

私は最初のバリエーションが(basketModuleを提供する)モジュールパターンを反映していると言いたいのですが、2番目のバリエーションは 'basket' * instances *を作る方法を提供します。それはすべての方法のラベルの問題です、あなたはまた、 'シングルトンパターン'も最初の変種名前を付けることができます。 – KooiInc

+0

モジュールは、インスタンス化可能なクラスのセットではなく、機能の分離されたパッケージであるという見方からは、そうです。しかし、2つの違いはあまり設計ではなく、構文です。 'var basketModule = new function(){...};'を使うことでシングルトンを2番目の方法にすることを止めることは何もありません。リターンオブジェクトを使用するという考え方は、必要に応じてインターフェイスを数行のコードに集約できるため、一目でわかることができます。しかし、これには大きな無名関数を使用しないでください。単に 'return {publicFunc:privateFunc};'を実行するだけです。 –

関連する問題