定义设计模式
一个构造函数在构造出一个对象后,以后再使用这个构造函数构造对象时,不会是新的对象,依旧是上一次的对象.也就是说:::浏览器
确保一个类仅有一个实例,并提供一个访问它的全局访问点。缓存
经过一个实用场景来理解单例模式的概念。当咱们点击登陆按钮的时候,会出现一个登陆的弹窗,而这个弹窗是惟一的,不论咱们点击多少次登陆按钮,弹窗只会被建立一次。函数
好比线程池、全局缓存等。咱们所熟知的浏览器的window对象就是一个单例,在JavaScript开发中,对于这种只须要一个的对象,咱们的实现每每使用单例。学习
实现思路this
用一个变量来标识当前的类已经建立过对象,若是下次获取当前类的实例时,直接返回以前建立的对象便可。spa
实现1:最简单的对象字面量prototype
var singleton = { attr : 1, method : function(){ return this.attr; } } var t1 = singleton ; var t2 = singleton ; 那么很显然的, t1 === t2 。
这个在日常使用的时候,仍是挺多的,在没有学习单例设计模式的概念以前,不知道这种也属于单例的。不过,存在的不足之处就是没有什么封装,全部的属性方法都是暴露的。对于一些须要使用私有变量的状况也不太合适。不过就经过这个例子加深一下对单例的概念的理解。线程
实现2:设计
// 定义一个类 function Singleton(name) { this.name = name; this.instance = null; } // 原型扩展类的一个方法getName() Singleton.prototype.getName = function() { console.log(this.name) }; // 获取类的实例 Singleton.getInstance = function(name) { if(!this.instance) { this.instance = new Singleton(name); } return this.instance }; // 获取对象1 var a = Singleton.getInstance('a'); // 获取对象2 var b = Singleton.getInstance('b'); // 进行比较 console.log(a === b); // true
总结: