[设计模式]单体模式

Javascript中的单体模式是常用的模式,也是最基本的一种模式。先说说有哪些优点,当然不止有两个优点,呵呵。
通常我们定义的函数或变量都会是在全局里,当然,把变量写在函数里并用var去定义的话,固然这个变量的作用域是在这个函数里面。
单体模式的优点是:
1、可以减少变量冲突,当然闭包也可以实现这点。
2、把功能代码都组织在一起,方便阅读和维护。
3、可以有更好的分支处理。

下面先来一段单体模式代码

//这是一个单体模式示例,就拿近期的项目来说明
//
呵呵,看下面的变量名,认识我的人,都知道是哪个项目啦。那项目就是用了单体模式。
var XZB = {
namespace:function(){

},
copyText:function(){

},
method1:function(){
}

....
}

这样XZB对象下面的变量就不会和全局变量发生冲突了,可以通过XZB[method1]来访问里面的方法。
也许有人问,var XZB这个不是在全局变量吗?不怕有冲突吗?呵呵,当然,这个唯一的保护层是很坚固,但也是很脆弱的。
所以在全局定义XZB之前,要判断一下全局有木有同名变量。

if(typeof XZB == "undefined") XZB = {};

单体模式里面的方法都是公有的,也就是说,可以通过XZB[method1]来访问里面的method1的方法。
但也有缺点,就是可以通过XZB[method1]=null 来KO一个方法,呵呵。
那么,有木有方法可以做到只公开一小部分方法呢?有,就是用闭包的方法:

var XZB = (function(){
var G = 10;
var Return = {
getG:function(){
return G;
},
setG:function(g){
G = g;
}
}
return Return;
})();

这样通过闭包自执行返回一个可公开的方法,这样只能访问和修改公开的变量了,即里面的getG和setG。
测试一下:

console.log(XZB.getG());  //10
XZB.setG(15);
console.log(XZB.getG()); //15
console.log(XZB.G) //G是闭包里面的私有变量,无法访问。


引:
如果先有以下:

var XZB = {
a:"123"
}

如果想要再加一个b:"456",

//往XZB追加b
XZB.b = "456";

console.log(XZB); //XZB = {a:"123",b:"456"}

注意以下的写法是错误的

//以下是错误的写法
XZB = {b:"456"}

console.log(XZB.a) //undefiend

因为这样就会给XZB重新开辟一个新的内存空间,也就是说,之前的a:"123"木有了。

一般在单体模式中按功能划分,比如:

var XZB = {
arrayMethod:{
indexOf:function(i){//获取数组元素索引},
getEle:function(i){//获取指定索引的元素}
},
stringMethod:{
sliceString:function(m,n){//截取某字符串},
stringLen:function(string){//返回字符串长度}
}
}






原文地址:https://www.cnblogs.com/zzbo/p/2349588.html