《JavaScript设计模式》深入学习 —— Module(模块)模式

模块是任何强大因工程需架构中不可或缺的一部分,它通常能够帮助我们清晰地分离和组织项目中的代码单元。

(1) 对象字面量

var myObject = {
    variableKey : ‘variableValue‘,
    functionkey : function () {
        // ...
    }
};

对象字面量不需要用new运算符来进行实例化,但不能用在一个语句的开头,因为开始可能被解读为一个块的开始。在对象的外部,新成员可以使用如下赋值语句来添加到对象字面量上:

myObject.array = ‘arrayValue‘;

(2) Module(模块)模式

在JavaScript中,使用Module(模块)模式进一步模拟类的概念,通过这种方式,能够使一个单独的对象拥有公有/私有方法和变量,从而屏蔽来自全局作用域的特殊部分。产生的结果是:函数名与在页面上其他脚本定义的函数冲突的可能性降低。

1. 私有

Module模式使用闭包封装“私有”状态和组织。它提供了一种包装混合公有/私有方法和变量的方式,防止其泄露到全局作用域,并与其他开发人员的接口发生冲突。通过该模式,只需要返回一个公有API,而其他的一切则维持在私有闭包里面。

这为我们提供了一个屏蔽处理底层事件逻辑的整洁整体方案,同时暴露一个接口供应用程序的其他部分使用。该模式除了返回一个对象而不是一个函数之外,非常类似于立即调用的函数表达式。

应该说明的是,在JavaScript章没有真正意义上的“私有”。在Module模式内,由于闭包的存在,声明的变量和方法只在该模式内部可用。但在返回对象上定义的变量和方法,则可以外部使用者都可用。

2. 示例

var testModule = ( function () {

    var counter = 0;

    return {
        incrementCounter : function () {
            return ++counter;
        },
        resetCounter : function () {
            console.log( ‘Counter value prior to reset : ‘ + counter );
            counter = 0;
        }
    };

} )();

用法:

// 增加计数器
testModule.incrementCounter();
// 检查计数器的值并重置
testModule.resetCounter();

实际上,counter变量是完全与全局作用于隔离的,且这两个方法在其他地方也无法直接读取,表现的它像是一个私有变量,它的作用域被局限于模块的闭包之中。

下面是一个包含命名空间、公有和私有的Module模式:

var myNamespace = ( function () {

    var myPrivateVar = 0;

    var myPrivateMethod = function ( foo ) {
        console.log(foo);
    };

    return {
        myPublicVar : ‘foo‘,
        myPublicFunc : function ( bar ) {
            myPrivateVar++;
            myPrivateMethod(bar);
        }
    };
} )();

我们来看另一个示例,一个使用这种模式实现的购物车:

var basketModule = ( function () {
    // 私有变量
    var basket = [];
    // 私有方法
    function doSomethingPrivate () {
        // ...
    }
    function doSomethingElsePrivate () {
        // ...
    }
    // 返回暴露出的公有对象
    return {
        // 添加item到购物车
        addItem : function ( values ) {
            basket.push ( values );
        },
        // 获取购物车的item数
        getItemCount : function () {
            return basket.length;
        },
        // 私有函数公有形式别名
        doSomething : doSomethingPrivate,
        // 获取购物车里所有item的价格总值
        getTotal : function () {
            var itemCount = this.getItemCount(),
                total = 0;

            while (itemCount--) {
                total += basket[itemCount].price;
            }
            return total;
        }
    };
} )();

// 调用
basketModule.addItem({
    item : ‘bread‘,
    price : 0.5
});
basketModule.addItem({
    item : ‘apple‘,
    price : 0.3
});
console.log(basketModule.getItemCount()); // 2

(3) 总结

优点: 首先,相比真正封装的思想,他对于很多拥有面向对象背景的开发人员更加整洁,其次它支持私有数据,因此在Module模式中,代码的公有部分能够接触到私有部分,然而外界无法接触类的私有部分。

缺点: 由于我们访问公有成员和私有成员的方式不同,当我们想要改变可见性的时候,实际上我们必须要修改每一个曾经使用过该成员的地方。同样,我们也无法访问那些之后在方法里添加的私有成员。

时间: 2024-12-14 05:56:31

《JavaScript设计模式》深入学习 —— Module(模块)模式的相关文章

《Head First 设计模式》学习笔记——模板方法模式

模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意. 设计模式 模板方法模式:在一个方法中定义一个算法的框架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结果的情况下,重新定义算法中的某些步骤. 模板就是一个方法,这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现.这样可以确

《Head First 设计模式》学习笔记——单件模式

设计模式 单件模式:确保一个类只有一个实例,并提供一个全局访问点. 要点 单件模式确保程序中一个类最多只有一个实例. 在Java中实现单件模式需要私有的构造器.一个静态方法.一个静态变量. 确定在性能和资源上的限制,然后小心翼翼的选择适当的方案来实现单件,以解决多线程问题. 全局变量缺点 如果将对象赋值给一个全局变量,那么必须在程序一开始就创建好对象.万一对象非常耗费资源,而程序在这次执行过程中并没有使用它,就形成了浪费. 单件模式 public class Singleton { //利用一个

javascript设计模式详解之命令模式

每种设计模式的出现都是为了弥补语言在某方面的不足,解决特定环境下的问题.思想是相通的.只不过不同的设计语言有其特定的实现.对javascript这种动态语言来说,弱类型的特性,与生俱来的多态性,导致某些设计模式不自觉的我们都在使用.只不过没有对应起来罢了.本文就力求以精简的语言去介绍下设计模式这个高大上的概念.相信会在看完某个设计模式之后有原来如此的感慨. 一.基本概念与使用场景: 基本概念: 将请求封装成对象,分离命令接受者和发起者之间的耦合. 命令执行之前在执行对象中传入接受者.主要目的相互

javascript设计模式-module(模块)模式

模块是任何强大应用程序中不可或缺的一部分,它通常能帮助我们清晰地分离和组织项目中的代码单元. js中实现模块的方法: 对象字面量表示法 Module模式 AMD模块 CommonJS模块 ECMAScript Harmony 模块 对象字面量 对象字面量不需要使用new运算符进行实例化,但不能用在一个语句的开头,因为开始的可能被解读为一个块的开始,在对象的外部,新成员可以使用如下赋值语句添加到对象字面量上,myModule.property = "someValue". var myM

学习javascript设计模式之发布-订阅(观察者)模式

1.发布-订阅模式又叫观察者模式,它定义对象之间一种一对多的依赖关系. 2.如何实现发布-订阅模式 2-1.首先指定好发布者 2-2.给发布者添加一个缓冲列表,用户存放回调函数以便通知订阅者 2-3.最后发布消息时候,发布者会遍历这个缓存列表,依次触发里面存放的订阅者回调函数 例子: var salesOffice = {};salesOffice.clientList = [];salesOffice.listen = function(key,fn){    if(!this.clientL

JavaScript设计模式与开发实践 模板方法模式

一.模板方法模式的定义和组成 模板方法模式是一种只需使用继承就可以实现的非常简单的模式. 模板方法模式由两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类.通常在抽象父类中封装了子类的算法框架,包括实现一些公共方法以及封装子类中所有方法的执行顺序.子类通过继承这个抽象类,也继承了整个算法结构,并且可以选择重写父类的方法. 二.第一个例子--Coffee or Tea 我们先来泡一杯咖啡,泡咖啡的步骤通常如下: 把水煮沸 用沸水冲泡咖啡 把咖啡倒进杯子 加糖和牛奶 var Coffee

《Head First 设计模式》学习笔记——工厂模式 + 抽象工厂模式

设计模式 工厂模式:定义一个创建对象的接口,但由子类决定要实例化的是哪一个.工厂方法让类把实例化推迟到子类. 所谓的"决定",并非指模式同意子类本身在执行时做决定,而是指在编写创建者类时.不须要知道实际创建的产品是哪一个. 选择了使用这个子类,就自然的决定了实际创建的产品是什么. 抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族.而不须要指定详细类. 抽象工厂的任务时定义一个负责创建一组产品的接口.这个接口内的每一个产品都负责创建一个详细产品.使用工厂方法. 设计原则 (1)多

javascript设计模式-Constructor(构造器)模式

Constructor是一种在内存已分配给该对象的情况下,用于初始化新创建对象的特殊方法.Object构造器用于创建特定类型的对象–准备好对象以备使用,同事接收构造器可以使用参数,以在第一次创建对象时,设置成员属性和方法值. 对象创建 创新新对象,在javascript中通常有两种方法: 对象直面量方法 var newObj = {}; 构造器的简洁方法 var newObj = new Object(); 在Object构造器为特定的值创建对象封装,或者没有传递值时,它将创建一个肯那个对象并返

《Head First 设计模式》学习笔记——命令模式

在软件系统,"行为请求者"与"行为实施者"通常存在一个"紧耦合".但在某些场合,比方要对行为进行"记录.撤销/重做.事务"等处理,这样的无法抵御变化的紧耦合是不合适的.在这样的情况下.怎样将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,实现二者之间的松耦合.这就是命令模式(Command Pattern)----题记 设计模式 命令模式:将"请求"封装成对

《Head First 设计模式》学习笔记——复合模式

模型-视图-控制器(MVC模式)是一种很经典的软件架构模式.在UI框架和UI设计思路中扮演着很重要的角色.从设计模式的角度来看,MVC模式是一种复合模式.它将多个设计模式在一种解决方式中结合起来,用来解决很多设计问题.MVC模式把用户界面交互分拆到不同的三种角色中,使应用程序被分成三个核心部件:Model(模型).View(视图).Control(控制器).----题记 设计模式 复合模式:结合两个或以上的模式,组成一个解决方式,解决一再发生的一般性问题.如MVC和Model 2 模型-视图-控