Вопрос по javascript – инкапсуляция в шаблоне модуля javascript

5

Я читал эту ссылкуhttp://addyosmani.com/largescalejavascript/#modpattern

И увидел следующий пример.

<code>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());
</code>

Он сообщает, что «шаблон модуля - это популярный шаблон, который включает в себя« конфиденциальность », состояние и организацию с использованием замыканий»; Чем это отличается от написания, как показано ниже? Может ли конфиденциальность быть просто обеспечена с помощью области действия?

<code>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});
</code>

Ваш Ответ

1   ответ
3

В первом варианте вы создаете объект без возможности создавать его новые экземпляры (это функция с немедленной реализацией). Второй пример - полная функция-конструктор, допускающая несколько экземпляров. Инкапсуляция одинакова в обоих примерах,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(),
Спасибо ... прекрасные объяснения :) eirikrl
Я предполагаю, что мой вопрос - это первый шаблон больше & quot; модуля & quot; чем второй. Ссылка использует первый вариант в качестве явного примера шаблона модуля. eirikrl
@eirikrl, когда дело доходит до нового ключевого слова, взгляните наstackoverflow.com/questions/383402/… для хорошего обсуждения по теме. TL; DR Есть много способов сделать что-то в JavaScript, и большинство из них не являются строго неправильными. :)
Я бы сказал, что первый вариант отражает шаблон модуля (basketModule), второй обеспечивает способ созданияbasket instances, Кстати, все дело в маркировке, первый вариант можно назвать также «синглтон».
С точки зрения того, что модуль является изолированным пакетом функциональных возможностей, а не набором инстанцируемых классов, тогда да. Однако различие между этими двумя понятиями заключается не столько в дизайне, сколько в его синтаксисе. Ничто не мешает вам иметь синглтон вторым способом, имеяvar basketModule = new function(){...};, Идея использования возвращаемого объекта заключается в том, что вы можете сжать интерфейс в несколько строк кода, если хотите, чтобы вы могли увидеть его с первого взгляда. Но вы бы не использовали для этого большие анонимные функции, вы просто сделали быreturn {publicFunc:privateFunc};.

Похожие вопросы