javascript单例模式(1)
2016-12-17 本文已影响91人
smartphp
单例(singleton).这种模式提供了一种将代码组织为一个逻辑单元的手段,可以通过单一变量来访问。通过确保单例对象只有一个拷贝,可以确保代买使用童颜的全局资源。单例可以用来划分命名空间,可以借助单例把代码组织的更为一致,从而更容易阅读和维护。
本文参照这本书第五章,介绍的重点和另一本书好像是不同的。结合着看看
s3398900.jpg
单例的基本结构
最基本的就是一个对象字面量
//对象字面量作为单体
var Singleton = {
attribute1: true,
attribute2: 10,
method1: function() {
},
method2: function(arg) {
}
};
Singleton.attribute1 = false; //修改
var total = Singleton.attribute2 + 5; //使用单例
var result = Singleton.method1();```
`方法位于对象字面量中就有了命名空间,和其他同名的函数就不会冲突了。对象字面量里的方法统一用 nameSpace.method的格式调用`
对象字面量的命名空间还可以继续划分例如parent.children.method。
这样不仅变量发生冲突的机会大大减少,而且归属更明确了。
上面的对象字面量的单例是不是很眼熟? 在node程序中的配置文件config.js里面是不是都是这种代码? 配置项都是全局唯一的。
#####惰性实例化
本来单例是想写这个内容的,但是今天一看,还是没看全。曾探的js模式书里的单例其实都是这个部分。`实际的单例代码放在一个函数中,然后使用一个变量来缓存实例化的代码,如果已经实例化就直接返回缓存的代码。`
MyNamespace.Singleton = (function() {
var uniqueInstance; // 私有变量缓存实例化单例
function constructor() { // 具体需要按需加载的代码.
var privateAttribute1 = false;
var privateAttribute2 = [1, 2, 3];
function privateMethod1() {
...
}
function privateMethod2(args) {
...
}
return { // Public members.
publicAttribute1: true,
publicAttribute2: 10,
publicMethod1: function() {
...
},
publicMethod2: function(args) {
...
}
} }
return {
getInstance: function() {
if(!uniqueInstance) { // 单例若不存在,调用constructor函数
uniqueInstance = constructor(); //调用constructor函数后,缓存返回值
}
return uniqueInstance;
}
}
})();