JavaScript 模块模式中的封装

encapsulation in javascript module pattern

本文关键字:封装 模式 模块 JavaScript      更新时间:2023-09-26

我正在阅读此链接 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});

在第一个变体中,您创建一个对象,而无法创建它的新实例(它是一个立即实例化的函数)。第二个示例是一个完整的构造函数,允许多个实例。两个示例中的封装相同,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(),