JavaScript模块是用于保持代码块之间相互独立而普遍使用的设计模式。对于熟悉面向对象语言的人来说,模块是JavaScript的”类”。在JavaScript中Module模式模拟了类的概念,用闭包封装了”私有”状态和方法。
我们用立即执行函数(Immediately-Invoked-Function-Expressions (IIFE)
) 创建私有空间,防止其泄露全局作用域。其样子如下:
var myGirlfriend = (function() {
// 定义私有变量或方法
var name = '小郑';
var _kiss = function() {
console.log('吻');
}
var _smile = function() {
console.log('微笑');
}
return {
// 暴露给公有的变量或方法
simle: _smile,
name: name
}
})();
console.log(myGirlfriend.name);
myGirlfriend.simle();
console.log(myGirlfriend._simle);
console.log(myGirlfriend._kiss);
/**
* 结果:
* 小美
* 微笑
* undefined
* undefined
*/
在Module模式内,由于闭包的存在,声明的变量和方法只在模式内部可用,但在返回的对象上定义的变量和方法,在对外部也可用。如上面例子:其他人可以知道我的女朋友的名字,也可以看到我女朋友微笑,但不可以吻我女朋友。
Module模式的优缺点:
优点:
- 实现代码的封装模块化
- 实现私有化变量和方法
缺点:
- 无法应用私有变量,造成无法对私有变量进行单元测试
- 当我们想改可见性时,实际上要修改每一个曾经使用过该成员的地方。
这里只举例了一种简单Module的设计模式,从Module模式上还衍生出Revealing Module(揭示模块)模式、Singleton(单例)模式。这些模式都很有使用价值,不同当我们的系统中出现了它们,则表示我们能需要评估我们的设计,例如Singleton的存在往往表明系统中的模块要么是系统紧密耦合,要么是其逻辑过于分散在代码库的多个部分中。