单例就是保证一个类只有一个实例,实现方法通常是先判断实例存在与否,若是存在直接返回,若是不存在就建立了再返回,这就确保了一个类只有一个实例对象。在JavaScript里,单例做为一个命名空间提供者,从全局命名空间里提供一个惟一的访问点来访问该对象。javascript
单例模式的思路是:一个类能返回一个对象的引用(而且永远是同一个)和一个得到该实例的方法(静态方法,一般使用 getInstance 名称)。那么当咱们调用这个方法时,若是类持有的引用不为空就返回该引用,否者就建立该类的实例,而且将实例引用赋值给该类保持的那个引用再返回。同时将该类的构造函数定义为私有方法,避免其余函数使用该构造函数来实例化对象,只经过该类的静态方法来获得该类的惟一实例java
var singleton = { attr : 1, method : function(){ return this.attr; } } var t1 = singleton ; var t2 = singleton ;
那么很显然的, t1 === t2 。缓存
十分简单,而且很是使用,不足之处在于没有什么封装性,全部的属性方法都是暴露的。对于一些须要使用私有变量的状况就显得爱莫能助了。固然在对于 this 的问题上也是有必定弊端的。安全
function Construct(){ // 确保只有单例 if( Construct.unique !== undefined ){ return Construct.unique; } // 其余代码 this.name = "NYF"; this.age="24"; Construct.unique = this; }
那么也有的, t1 === t2 。闭包
也是很是简单,无非就是提出一个属性来作判断,可是该方式也没有安全性,一旦我在外部修改了Construct的unique属性,那么单例模式也就被破坏了。函数
对于大着 灵活 牌子的JS来讲,任何问题都能找到 n 种答案,只不过让我本身去掂量孰优孰劣而已,下面就简单的举几个使用闭包实现单例模式的方法,无非也就是将建立了的单例缓存而已。this
var single = (function(){ var unique; function Construct(){ // ... 生成单例的构造函数的代码 } unique = new Constuct(); return unique; })();
只要 每次讲 var t1 = single; var t2 = single;便可。 与对象字面量方式相似。不过相对而言更安全一点,固然也不是绝对安全。spa
若是但愿会用调用 single() 方式来使用,那么也只须要将内部的 return 改成code
return function(){ return unique; }
以上方式也可使用 new 的方式来进行(形式主义的赶脚)。固然这边只是给了闭包的一种例子而已,也能够在 Construct 中判断单例是否存在 等等。 各类方式在各个不一样状况作好选着便可。对象
总的来讲,单例模式相对而言是各大模式中较为简单的,可是单例模式也是较为经常使用而且颇有用的模式。在JS中尤其突出(每一个对象字面量均可以看作是一个单例么~)。
记住,是否严格的只须要一个实例对象的类(虽然JS没有类的概念),那么就要考虑使用单例模式。
使用数据缓存来存储该单例,用做判断单例是否已经生成,是单例模式主要的实现思路。