javascript -- 单例模式

 1 //单例模式(单例模式的核心是确保只有一个实例,并提供全局访问。)
 2 var Create = (function(){
 3     var instance;
 4     var Create = function(name){
 5         if(instance){
 6             return instance;
 7         }
 8         this.name = name;
 9         return instance = this;
10     }
11     return Create;
12 })();
13 
14 var create1 = new Create("lu");
15 var create2 = new Create("guiqing");
16 console.log(create2.name);//lu
17 console.log(create1.name);//lu
18 //这里,我们使用了自执行的匿名函数和闭包,用于封装instance变量,但当我们想得到普通的构造函数,这要修改我们的构造函数,会很麻烦,所以下面用代理的单例模式
19 
20 
21 var Create = function(name){
22     this.name = name;
23 }
24 
25 var ProxyCreate = (function(){
26     var instance;
27     return function(name){
28         if(instance){
29             return instance;
30         }
31         instance = new Create(name);
32         return instance;
33     }
34 })();
35 
36 var create1 = new Create("normal");
37 var create2 = new ProxyCreate("gui");
38 var create3 = new ProxyCreate("qing");
39 
40 console.log(create1);//normal
41 console.log(create2);//gui
42 console.log(create3);//gui
43 
44 //我们通过把构造函数给提取出来,用代理的方式实现单例

JavaScript 中的单例模式传统的单例模式实现在JavaScript 中并不适用

var a = {};
当用这种方式创建对象a 时,对象a 确实是独一无二的。如果a 变量被声明在全局作用域下,
则我们可以在代码中的任何位置使用这个变量,全局变量提供给全局访问是理所当然的。这样就
满足了单例模式的两个条件。

但是这种容易造成全局污染

①  通过定义对象字面量来减少全局变量的冲突

②  使用闭包封装私有变量

 

单例的用处

单例模式是一种简单但非常实用的模式,特别是惰性单例技术,在合适的时候才创建对象,并且只创建唯一的一个。

var createLoginLayer = function(){
	console.log("in")
	console.log(this)
	var div = document.createElement( 'div' );
	div.innerHTML = '我是登录浮窗';
	div.style.display = 'none';
	document.body.appendChild( div );
	return div;
};
var getSingle = function( fn ){
	var result;
	  return function(){
	  return result || ( result = fn .apply(this, arguments ) );
	}
};
var createSingleLoginLayer = getSingle( createLoginLayer );
document.getElementById( 'loginBtn' ).onclick = function(){
	var loginLayer = createSingleLoginLayer();
	loginLayer.style.display = 'block';
};

  

原文地址:https://www.cnblogs.com/luguiqing/p/7718033.html