单例模式的思想在于保证一个特定类仅有一个实例,并提供一个访问它的全局访问点。
- 使用对象字面量
在使用对象字面量创建对象时,实际上就创建了一个单例。
var obj={
name: value
}
带私有变量和私有方法的单例:
var mySingleton = function () {
/* 这里声明私有变量和方法 */
var privateVariable = 'something private';
function showPrivate() {
console.log(privateVariable);
}
/* 公有变量和方法(可以访问私有变量和方法) */
return {
publicMethod: function () {
showPrivate();
},
publicVar: 'the public can see this!'
};
};
- 使用new操作符
function Universe() {
// 判断是否存在实例
if (typeof Universe.instance === 'object') {
return Universe.instance;
}
// 其它内容
this.start_time = 0;
this.bang = "Big";
// 缓存
Universe.instance = this;
// 隐式返回this
}
// 测试
var uni = new Universe();
var uni2 = new Universe();
console.log(uni === uni2); // true
这个解决方法非常直接,唯一的缺点instance属性是公开的,有被修改的风险。
- 重写构造函数
function Universe() {
// 缓存的实例
var instance = this;
// 其它内容
this.start_time = 0;
this.bang = "Big";
// 重写构造函数
Universe = function () {
return instance;
};
}
// 测试
var uni = new Universe();
var uni2 = new Universe();
console.log(uni === uni2); // true
第一次调用原始构造函数,像往常一样返回this。而第二次开始将执行重写的构造函数。但是会丢失所有在初始定义和重定义时刻之间添加到它里面的属性。
1.使用闭包封装构造函数和实例
var Universe;
(function () {
var instance;
Universe = function Universe() {
if (instance) {
return instance;
}
instance = this;
// 其它内容
this.start_time = 0;
this.bang = "Big";
};
} ());
//测试代码
var a = new Universe();
var b = new Universe();
alert(a === b); // true
参考:《JavaScript模式》
]http://www.cnblogs.com/TomXu/archive/2012/02/20/2352817.html[(http://www.cnblogs.com/TomXu/archive/2012/02/20/2352817.html)
http://www.dengzhr.com/js/1125