用JavaScript来实现单例模式
首先,了解一下什么是单例模式,这里我直接把菜鸟教程中的定义给copy过来:
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
注意:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
用一句话来总结就是:在单例模式中,一个类仅有一个实例,并提供一个访问它的全局访问点。这无非是用一个变量来标志当前是否已经为某个类创建过对象,如果是,则在下一次获取该类的实例时,直接返回之前创建的对象,在JavaScript我们很自然而然就会想到用闭包来解决这个问题。
比如说需要生成一个页面登录框,因为有且只可能有一个登录框,那么你就可以用单例的思想去实现他,代码如下:
1 let createLoginWindow = function(title) { 2 this.title= title; 3 this.init(); 4 } 5 6 createLoginWindow.prototype.init = function() { 7 // some code 8 9 } 10 let proxySingleton = (function() { 11 var instance; 12 return function(title) { 13 if (!instance) { 14 instance = new createLoginWindow(title); 15 } 16 return instance; 17 } 18 })(); 19 let windowA = new proxySingleton('login1'); 20 let windowB = new proxySingleton('login2'); 21 22 console.log(windowA === windowB); // true
可以看到,上述代码中createLoginWindow负责构造对象,然后通过代理proxySingleton来判断是构造新的对象还是返回已有对象。