10、单例模式
单例模式 :又称为单体模式,是只允许实例化一次对象类。有时候也用一个对象规划一个命名空间,在对象上添加属性与方法。
10.1 经常会遇到这样
1 function g(id){ 2 return document.getElementById(id); 3 } 4 5 function css(id, key, value){ 6 g(id).style[key] = value; 7 } 8 9 function attr(id, kye, value){ 10 g(id)[key] = value; 11 } 12 13 function html(id, value){ 14 g(id).innerHtml = value; 15 } 16 function on(id, type, fn){ 17 g(id)['on' + type] = fn; 18 }
这样写,会有问题的。会给页面添加了很多变量,比如你绑定的事件方法on,日后其他人也添加需求,增加代码定义一个on变量或者重写了on方法,就会跟其他人写的代码冲突。所有最好的办法用单利修改一下书写代码。
10.2命名空间的管理
命名空间就是人们常说的namespace,有人叫他命名空间,它解决这么一类问题:为了让代码更易懂,每个人定义的变量来解决这类问题,防止命名重复,例如:
xiaowang.xx来使用。
1 var Mimg = { 2 g : function(id){ 3 return document.getElementById(id); 4 }, 5 css : function(id, key, value){ 6 g(id).style[key] = value; 7 } 8 }
由于g方法和css 方法都在单例对象中Ming, 所有两个方法都是单例对象Ming的方法,而对象中this 指代当前对象,所以在css 中通过this.g来使用Ming单例对象
中的g方法。
这样写执行后提示:Uncaught TypeError: Cannot read property 'style' of undefined
单例互相调用要使用 Ming.g(id).style[key] = value; 单例模式要使用定义的方法一定加上命名空间Ming中。
或
this来调用方法使用
1 var Mimg = { 2 g : function(id){ 3 return document.getElementById(id); 4 }, 5 css : function(id, key, value){ 6 this.g(id).style[key] = value; 7 8 } 9 }
10.3模块分明
不同模块要单独独立出来
10.4 创建一个小型代码库
小型代码库,可以使用单例来规范我们自己代码库各个模块,如,共用模块,工具模块,ajax模块和其它模块。
1 var A = { 2 Utils : { 3 util_methods1 : function(){}, 4 util_methods2 : function(){} 5 }, 6 Tool : { 7 tool_methods1 : function(){} 8 }, 9 ajax : { 10 get : function(){}, 11 post : function(){} 12 }, 13 others : { 14 //code... 15 } 16 } 17 18
方法调用:
A.ajax.get();
10.5无法修改的静态变量
1 var Conf = (function(){ 2 //私有变量 3 var conf = { 4 MAX_NUM : 100, 5 MIN_NUM : 1, 6 COUNT :1000 7 } 8 //返回取值对象 9 return { 10 get : function(name){ 11 return conf[name] ? conf[name] : null; 12 } 13 } 14 })();
静态变量只能读取,不能修改
var cont = Conf.get('COUNT'); // 1000