有人进一步改进了模块模式,即在返回对象之前加入对其增强的代码。这种增强的模块模式适合那些单例必须是某种类型和的实例,同时还必须添加某些属性和(或)方法对其加以增强的情况。
var singleton = function() {
// 私有变量和私有函数
var privateVariable = 10;
function privateFunction() {
return false;
}
// 创建对象
var object = new CustomType();
// 添加特权/公有属性和方法
object.publicProperty = true;
object.publicMethod = function() {
privateVariable++;
return privateFunction();
}
return object;
}
如果 application 对象必须是 BaseComponent (不用去关心 BaseComponent 代码是如何实现的) 实例:
var application = function() {
// 私有变量和函数
var components = new Array();
// 初始化
components.push(new BaseComponent());
// 创建 application 的一个副本
var app = new BaseComponent();
app.getComponentCount = function() {
return components.length;
}
app.registerComponent: function(component) {
if(typeof component == "object") {
components.push(component);
}
}
// 公共
return app;
}();
在这个重写后的应用程序(application)单例中,首先也是像前面例子中一样定义了私有变量。主要不同之处在于命名变量 app 的创建过程,因为它必须是 BaseComponent 的实例。
这个实例实际上是 application 对象的局部变量版。此后,我们又为 app 对象添加了能够访问私有变量的公有方法。
最后一步是返回 app 对象,结果仍然是将它赋值给全局变量 application。