参考文章:
http://www.cnblogs.com/TomXu/archive/2012/02/20/2352817.html
单例模式:保证一个类只有一个实例,实现方法是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,确保一个类只有一个实例对象。
在javascript里,单例作为一个命名空间提供者,从全局命名空间里提供了一个唯一的访问点来访问该对象。
java中的单例模式是 :私有化构造方法了,所以只能有一个实例对象,也就是单例。
自我感受:单例模式是在内部实例化了一次对象A,然后返回这个实例instance,所以在外部再new一个对象A的时候,得到的就是这个对象A的实例instance;
相当于将所有在外部实例化A的对象的都是instance的引用; 对的,就是引用,指针指向同一个内存区域,所以不管是instance ,还是通过new A()new出来的对象a,b,c,d....它们中任意一个,做出任何改变,都会影响其他人,因为它们共用一个内存区域嘛!!
可以把外部new出来的对象,其实可以看成是一个人,只是用的不同的名字而已啦!
接下来就来阐释一下单例模式的实现方法:
(1)最简单的方法:对象字面量的方法
var Singleton = (function () {
var instantiated;
function init() {
/*这里定义单例代码*/
return {
publicMethod: function () {
console.log('hello world');
},
publicProperty: 'test'
};
}
return {
getInstance: function () {
if (!instantiated) { //确保只有一个实例
instantiated = init(); //使用init方法,是使publicMethod和publicP roperty只在要使用的时候才初始化;
}
return instantiated;
}
};
})();
/*调用公有的方法来获取实例:*/
Singleton.getInstance().publicMethod();
果然是最简单的,因为最好理解
(2)方法二:利用this
(this是执行上下文中的一个属性。执行上下文是一个对象,它的属性包括VO:变量对象和this:thisValue)
this与上下文中可执行代码的类型有直接关系,this值在进入上下文时确定,并且在上下文运行期间永久不变。
关于this的详解参考:http://www.cnblogs.com/TomXu/archive/2012/01/17/2310479.html#3364439
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
uni.v = 'test';
uni2.v ; //'test' ;证明了共享同一个命名空间
这个方法有点不理解
(3)方法三:重写构造函数
function Universe() { // 缓存的实例 var instance = this; // 其它内容 this.start_time = 0; this.bang = "Big"; // 重写构造函数 Universe = function () { return instance; }; }
(4)方法四:
function Universe() { // 缓存实例 var instance; // 重新构造函数 Universe = function Universe() { return instance; }; // 后期处理原型属性 Universe.prototype = this; // 实例 instance = new Universe(); // 重设构造函数指针 instance.constructor = Universe; // 其它功能 instance.start_time = 0; instance.bang = "Big"; return instance; }
(5)方法五:
var Universe; (function () { var instance; Universe = function Universe() { if (instance) { return instance; } instance = this; // 其它内容 this.start_time = 0; this.bang = "Big"; }; } ());