模块化模式

概念

模块化模式最初被定义为一种对传统软件工程中的类提供私有和公共封装的方法。在 JavaScript 中,模块化模式用来进一步模拟 的概念。

模块模式使用 闭包 的方式提供了一种将公有和私有方法,变量封装混合在一起的方式,这种方式防止内部信息泄露到全局中,从而避免了和其它开发者接口发生冲图的可能性。在这种模式下只有公有的API 会返回,其它将全部保留在闭包的私有空间中。

这个模式非常类似于立即调用函数式表达式,但是这种模式返回的是对象,而立即调用函数表达式返回的是一个函数。

通用模版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var myNamespace = (function () {
var myPrivateVar, myPrivateMethod;
// 私有变量-计数器
myPrivateVar = 0;
// 私有方法
myPrivateMethod = function( foo ) {
console.log( foo );
};
return {
// 公有变量
myPublicVar: "foo",
// 公有方法
myPublicFunction: function( bar ) {
myPrivateVar++;
myPrivateMethod( bar );
}
};
})();

变体-传入参数

比如,将全局(例如 jQuery, Underscore)作为一个参数传入模块的匿名函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Global module
var myModule = (function ( jQ, _ ) {

function privateMethod1(){
jQ(".container").html("test");
}

function privateMethod2(){
console.log( _.min([10, 5, 100, 2, 1000]) );
}

return{
publicMethod: function(){
privateMethod1();
}
};

// Pull in jQuery and Underscore
}( jQuery, _ ));

myModule.publicMethod();

暴露式模块模式

在这个模式中,可以简单地在私有域中定义所有的函数和变量,并且返回一个 匿名对象 ,这个对象包含有一些指针,这些指针指向想要暴露出来的私有成员,使这些私有成员公有化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var myRevealingModule = function () {

var privateVar = "Ben Cherry",
publicVar = "Hey there!";

function privateFunction() {
console.log( "Name:" + privateVar );
}

function publicSetName( strName ) {
privateVar = strName;
}

function publicGetName() {
privateFunction();
}

// 暴露公有指针指向私有方法和属性
return {
setName: publicSetName,
greeting: publicVar,
getName: publicGetName
};

}();

这个模式可以用于将私有函数和属性以更加规范的命名方式展现出来。

参考

  1. 学用 JavaScript 设计模式 - 模块化模式
  2. 学用 JavaScript 设计模式 - 暴露模块模式
坚持原创技术分享,您的支持将鼓励我继续创作!