你将了解一种设计模式-单体模式!
你将了解单体模式的优点!
单体模式
单体模式的思想在于保证一个特定类仅有一个实例。这意味着当您第二次使用同一个类创建新对象的时候,应该得到与第一次所创建对象完全相同对象。
如何将这种模式模式应用到 JavaScript ?在 JavaScript 中没有类,只有对象。实际上当创建一个新对象时,此新对象已经是单体了。
创建一个新对象(单体)例子 :
var person = {
name : 'Danile',
};
但在 JavaScript 中,对象之间永远不会完全相等,除非它们是同一个对象,哪怕创建一个具有完全相同成员但同类对象,它也不会与第一个对象完全相同。例如:
var person2 = {
name : 'Danile',
};
person === person2 // false
person == person2 // false
so~~在 JavaScript 创建一个对象的时候,实际上就是创建一个单体。
使用 new 操作符
JavaScript 中具有 new 语法可使用构造函数来创建对象,而且有时可能需要使用这种语法但单体实现。这种思想在于当使用同一个构造函数以 new 操作符来创建多个对象时,应该仅获得指向完全相同的对象的新指针。
var person1 = new person();
var person2 = new person();
person1 = person2; // true
person对象仅会在第一次调用构造函数时被创建。在第二次(以及第三次以后)创建时将会返回同一个person对象。这就是为什么 person1 === person2,因为它们本质上是指向同一个对象的两个引用。
JavaScript 中如何实现该模式?
- 可以使用全局变量来存储该实例。(不推荐)
- 可以在构造函数的静态属性中缓存该实例。(缺点在于某些属性是公开可访问的属性,在外部代码中可能会修改该属性,以至于会丢失该实例)
- 可以将该实例包装在闭包中。这样可以保证该实例的私有性并且保证该实例不会被构造函数以外的代码所修改。(缺点是带来了额外的闭包开销)
闭包中的实例
直接上代码:
function Universe() {
// 缓存实例
var instance = this;
// 缓存实例
this.start_time = 0;
this.bang = "Big";
//重写该构造函数
Universe = function () {
return instance ;
};
}
// 测试
var uni1 = new Universe();
var uni2 = new Universe();
uni1 === uni2; // true
由此可见,第一次调用原始构造函数时,它会像往常一样返回 this。依次类推,再次调用时,将执行重写的构造函数。
单体模式的优点
第一个优点:划分命名空间
当在做项目的时候,肯定不是一个人在做,而是一伙人,当一个页面中包含多个js文件的时候,由于每个人的变量命名不同,很大程度上会发生变量覆盖的情况,而用单体模式,把变量保存在对象中,很好的避免了这一点。
第二个优点:提高代码的阅读性,维护性
使用单体模式,每个方法都被封装在对象中,而且每个方法只做一件事,所在在后期代码维护上,只需要维护特定位置的代码就可以了。
第三个优点:可以实例化,但只能实例化一次