单体模式:
单体模式用于创建命名空间,将一批关联的属性和方法组织成一个逻辑单元,减少全局变量。
逻辑单元中的代码通过单一的变量进行访问。
- 一个单体对象由对象本身 和 访问这个对象的变量组成。此变量通常为全局变量,所以单体对象能在页面任何位置被访问,故此变量可看做单体对象内部属性和方法的一个命名空间。
特点:
- 该类只有一个实例;
- 该类自行创建该实例,即在该类内部创建自身的实例对象;
- 向整个系统公开这个实例接口。
弊端:
耦合度高,不容易进行单元测试。
适合场合:
提供命名空间,增加代码模块性,分支功能。
应用
关于JavaScript的最头疼的事情之一是,它的变量没有特定的作用范围。 一般情况下,任何变量,函数,数组或对象都是全局性,这意味着在同一页上的其他脚本可以访问并覆盖它们。解决方法是把变量封装在一个匿名函数中。 例如,下面的定义将产生三个全局变量和和两个全局函数:
var name = 'Chris';
var age = '34';
var status = 'single';
function createMember(){
// [...]
}
function getMemberDetails(){
// [...]
}
封装后如下:
var myApplication = function(){
var name = 'Chris';
var age = '34';
var status = 'single';
return{
createMember:function(){
// [...]
},
getMemberDetails:function(){
// [...]
}
}
}();
这被称为单体模式,是JavaScript设计模式的一种,改进的写法是:
var myApplication = function(){
var name = 'Chris';
var age = '34';
var status = 'single';
function createMember(){
// [...]
}
function getMemberDetails(){
// [...]
}
return{
create:createMember,
get:getMemberDetails
}
}();
利用分支技术来来封装浏览器之间的差异
注意的地方:
- 一定要用闭包,实现即时绑定;
- 每个分支之间用分号隔开;
- 最后返回的是分支的名字;
- 调用的时候用单体名+分支的方法名。
// 利用单体的分支技术来定义XHR(XMLHttpRequest)对象,必须要用闭包才可以实现
var XHR = (function () {
var standard = {
cXHR: function () {
return new XMLHttpRequest();
}
};
var activeXNew = {
cXHR: function () {
return new ActiveXObject('Msxml2.XMLHttp');
}
};
var activeXOld = {
cXHR: function () {
return new ActiveXObject('Microsoft.XMLHttp');
}
};
var testObject;
try {
testObject = standard.cXHR();
return standard;
} catch (e) {
try {
testObject = activeXNew.cXHR();
return activeXNew;
} catch (e) {
try {
testObject = activeXOld.cXHR();
return activeXOld;
} catch (e) {
throw new Error('Create the XMLHttpRequestObject failed!');
}
}
}
})();
window.onload = function () {
alert(XHR.cXHR());
}
网友评论