6

私はこのリンクを読んでいましたhttp://addyosmani.com/largescalejavascript/#modpattern

そして、次の例を見ました。

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

1 に答える 1

4

最初のバリアントでは、オブジェクトの新しいインスタンスを作成する可能性なしにオブジェクトを作成します(これはすぐにインスタンス化される関数です)。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(),
于 2012-04-28T11:17:42.430 に答える