- 单体(singleton)模式是javascript中最基本但又最有用的模式之一,它可能比其他任何模式都常用。
- 这种模式提供了一种将代码组织为一个逻辑单元的手段,这个逻辑单元中的代码可以通过单一的变量进行访问。通过确保单体对象只存在一份实例,你就可以确信自己的所有代码使用的都是同样的全局资源。
- 简单单体
- 闭包单体
- 惰性单体
- 分支单体
//单体模式
var Ext = {};
Ext.model = {
attr : 10,
attr2 : 20,
fn1 : function(){
console.log('fn1');
},
fn2 : function(){
console.log('fn2');
}
}
console.log(Ext.model.attr);
Ext.model.fn1();
//闭包单体
var Ext = {};
Ext.model = (function(){
//给自己添加私有成员
attr = 10;
attr2 = 20;
var methods = function(){
console.log('methods1');
}
var mothods2 = function(){
console.log('methods2');
}
//把块级作用域里的执行结果复制给我的单体对象
return {
a1 : attr,
a2 : attr2,
m1 : function(){
return methods();
},
m2 : function(){
return methods2();
}
}
})();
console.log(Ext.model.a1);
Ext.model.m1();
//惰性单体,和闭包单体有一些相似的地方
var Ext = {};
Ext.model = (function(){
//私有变量,控制返回的对象
var result; //undinfined
//需要一个构造器,init初始化单体对象的方法
function init(){
//私有成员变量
var attr1 = 10;
var attr2 = 20;
var methods1 = function(){
console.log('methods1');
};
var methods2 = function(){
console.log('methods2');
};
return {
a1 : attr1,
a2 : attr2,
m1 : function(){
return methods1();
},
m2 : function(){
return methods2();
}
}
}
return {
getmodel : function(){
//如果不存在就创建单体
if(!result){
result = init();
}
return result;
}
}
})();
console.log(Ext.model.getmodel().a1);
Ext.model.getmodel().m1();
//分支单体 用于判断浏览器差异检测
var Ext = {};
var def = true;
Ext.model = (function(){
var objA = {
attr1 : '火狐浏览器'
// 属性1
// 属性2
// 方法1
// 方法2
};
var objB = {
attr1 : 'IE浏览器'
// 属性1
// 属性2
// 方法1
// 方法2
}
return (def) ? objA : objB;
})();
console.log(Ext.model.attr1);