The Revealing Module Pattern(显示模块模式)
现在我们已经对模块模式有了更进一步的了解,让我们再来看一个轻微的改进版 - Christian Heilmann的显示模块模式。
显示模块的出现是由于Heilmann对于一个事实非常沮丧,当他从另一个方法调用一个公有方法或者访问公有变量时,必须要重复主对象的名称。而且使用Module时必须要切换到对象字面量表示法来让某种方法变成公有方法。
他努力的结果就是更新了模式,我们可以在私有的作用域内简单的定义所有的方法和变量,并且返回一个匿名的对象指向我们希望公开的私有方法。
案例如下:
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
};
})();
myRevealingModule.setName( "Paul Kinlan" );
如果我们愿意的话,这种模式也可以用一个更具体的方案来显示私有函数和属性。
var myRevealingModule = (function () {
var privateCounter = 0;
function privateFunction() {
privateCounter++;
}
function publicFunction() {
publicIncrement();
}
function publicIncrement() {
privateFunction();
}
function publicGetCount(){
return privateCounter;
}
// Reveal public pointers to
// private functions and properties
return {
start: publicFunction,
increment: publicIncrement,
count: publicGetCount
};
})();
myRevealingModule.start();
优点
这种模式可以让我们脚本的语法变得更加一致,它也让模块的结尾更加的清晰。我们的方法和变量可公开访问,从而简化可读性。
缺点
如果一个私有方法引用了一个公有的方法,如果补丁是必要的则公有方法是不可以被重写的。这是因为私有方法将继续引用私有的实现并且模式不应该应用于私有成员,只适用于私有函数。
引用私有变量的公有对象成员也服从上面的无补丁规则。
因此,用显示模块模式创建的模块,可能比用传统的模块模式创建的模块更脆弱,所以在使用过程中应多加小心。