9.3 Revealing Module(揭示模块)模式
现在对Module模式应该更加熟悉了,让我们来看一个稍有改进的版本—Christian Heilmann的Revealing Module模式。
Revealing Module模式的产生是因为Heilmann很不满意这种状况:当他想从另一个方法调用一个公有方法或访问公有变量时,必须要重复主对象的名称。他也不喜欢使用Module模式时,必须要切换到对象字面量表示法来让某种方法变成公有方法。
他努力的结果就是创建了一个更新的模式,能够在私有范围内简单定义所有的函数和变量,并返回一个匿名对象,它拥有指向私有函数的指针,该函数是他希望展示为公有的方法。
有关如何使用Revealing Module模式的示例如下所示:
var myRevealingModule = function () {
var privateVar = "Ben Cherry",
publicVar = "Hey there!";
function privateFunction() {
console.log("Name:" + privateVar);
}
function publicSetName(strName) {
privateName = 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;
}
// 将暴露的公有指针指向到私有函数和属性上
return {
start: publicFunction,
increment: publicIncrement,
count: publicGetCount
};
}();
myRevealingModule.start();
9.3.1 优点
该模式可以使脚本语法更加一致。在模块代码底部,它也会很容易指出哪些函数和变量可以被公开访问,从而改善可读性。
9.3.2 缺点
该模式的一个缺点是:如果一个私有函数引用一个公有函数,在需要打补丁时,公有函数是不能被覆盖的。这是因为私有函数将继续引用私有实现,该模式并不适用于公有成员,只适用于函数。
引用私有变量的公有对象成员也遵守无补丁规则。
正因为如此,采用Revealing Module模式创建的模块可能比那些采用原始Module模式创建的模块更加脆弱,所以在使用时应该特别小心。
时间: 2025-01-19 03:12:19