Инкапсуляция в шаблоне модуля javascript
Я читал эту ссылку http://addyosmani.com/largescalejavascript/
И увидел следующий пример.
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});
1 ответ
Решение
В первом варианте вы создаете объект без возможности создавать его новые экземпляры (это функция с немедленной реализацией). Второй пример - полная функция конструктора, допускающая несколько экземпляров. Инкапсуляция одинакова в обоих примерах, 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(),