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'; };