惰性模式(layier):减少每次代码执行时的重复性的分支判断,通过对对象重定义来屏蔽原对象中的分支判断。
//单体模式定义命名空间 var A ={} A.on = function(dom,type,fn){ if(dom.addEventListener){ dom.addEventListener(type,fn,false); }else if(dom.attachEvent){ dom.attachEvent('on'+type,fn); }else{ dom['on'+type] = fn; } }
为元素添加事件时,总是做一遍能力检测,在同一个浏览器执行两次方法,是不会走不同的分支的。采用惰性模式来解决减少函数执行时的重复性分支判断。惰性模式有两种实现方式:1.第一种是在文件加载进来时通过闭包执行该方法对其重新定义,不过会使得页面加载时占用一定的资源。2.第二种是在第一种方式基础上做一次延时执行,在函数第一次调用的时候对其重定义。好处是减少文件加载时的资源消耗,但是在第一次执行有一定的资源消耗,所以是一种对消耗的惰性推移。
1.第一种方法使用加载即执行,在原先的基础上在分支判断中直接return退出循环。
var A ={} A.on = function(dom,type,fn){ if(dom.addEventListener){ return function(dom,type,fn){ dom.addEventListener(type,fn,false); } }else if(dom.attachEvent){ return function(dom,type,fn){ dom.attachEvent('on'+type,fn); } }else{ return function(dom,type,fn){ dom['on'+type] = fn; } } }();
2.惰性执行,对dom执行能力检测并显示重写,在函数最末尾重新执行一遍来绑定事件,不过在文件加载后A.on方法还没能重新被蒂尼工艺,直到某一元素绑定事件时,A.on才能被重新定义
var A ={} A.on = function(dom,type,fn){ if(dom.addEventListener){ A.on = function(dom,type,fn){ dom.addEventListener(type,fn,false); } }else if(dom.attachEvent){ A.on = function(dom,type,fn){ dom.attachEvent('on'+type,fn); } }else{ A.on = function(dom,type,fn){ dom['on'+type] = fn; } } //执行重定义on方法 A.on(dom,type,fn); };
惰性模式是一种拖延模式,由于对象的创建或者数据的计算会花费高昂的代价,因此页面会延迟对这一类对象的创建。