单体(singleton)模式是javascript中最基本但又是最有用的模式之一,它可能比其他任何模式都常用。这种模式提供了一种将代码组织为一个逻辑单元的手段,这个逻辑单元中的代码可以通过单一的变量进行访问。通过确保单体对象只存在一份实例,你就可以确信自己的所有代码使用的都是同样的全局资源
简单单体模式
var Singleton = {
attr1: true ,
attr2: 10 ,
method1 : function(){
alert('我是方法1');
},
method2 : function(){
alert('我是方法2');
}
};
alert(Singleton.attr1);
// 补充 :划分命名空间 (区分代码) Ext.Manager.attr1 / method1
var BHX = {};
BHX.Singleton = {
attr1: true ,
attr2: 10 ,
method1 : function(){
alert('我是方法1');
},
method2 : function(){
alert('我是方法2');
}
};
BHX.Singleton.method1();
闭包单体
闭包主要的目地是保护数据,可以添加自己的私有成员,外界无法直接访问,只能通过暴露出去的方法或属性来访问
var BHX = {} ;
BHX.Singleton = (function(){
// 添加自己的私有成员
var a1 = true ;
var a2 = 10 ;
var f1 = function(){
alert('f1');
};
var f2 = function(){
alert('f2');
};
// 把块级作用域里的执行结果赋值给单体对象
return {
attr1: a1 ,
attr2: a2 ,
method1 : function(){
return f1();
},
method2 : function(){
return f2();
}
} ;
})();
alert(BHX.Singleton.attr1);
BHX.Singleton.method1();
惰性单体
对于上述闭包这种模式,如果私有的成员变量很多的话,只能被一次性加载,无法做到对其中某些变量只有用到的时候才会去加载。因此惰性单体模式可以有效解决这种问题
var Ext = {};
Ext.Base = (function() {
// 私用变量 控制返回的单体对象
var uniqInstance; // undefined
// 需要一个构造器 init 初始化单体对象的方法
function init() {
// 私用成员变量
var a1 = 10;
var a2 = true;
var fn1 = function() { alert('fn1') };
var fn2 = function() { alert('fn2') };
return {
attr1: a1,
arrt2: a2,
method1: function() {
return fn1();
},
method2: function() {
return fn2();
}
};
}
return {
getInstance: function() {
if (!uniqInstance) { //如果不存在 创建单体实例
uniqInstance = init();
}
return uniqInstance;
}
};
})();
alert(Ext.Base.getInstance().attr1);
Ext.Base.getInstance().method1();
对于这种模式,我们可以有很多个类似uniqInstance的变量来控制之后执行的init方法中需要被加载的变量及方法,只需要分别调用不同的getInstance来做多资源需要被调用的时候才会去加载
分支单体
判断程序的分支 <浏览器差异的检测>
var Ext = {} ;
var def = false ;
Ext.More = (function(){
var objA = { // 火狐浏览器 内部的一些配置
attr1:'FF属性1'
// 属性1
// 属性2
// 方法1
// 方法2
} ;
var objB = { // IE浏览器 内部的一些配置
attr1:'IE属性1'
// 属性1
// 属性2
// 方法1
// 方法2
} ;
return (def) ?objA:objB;
})();
alert(Ext.More.attr1);