惰性模式(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);
};

惰性模式是一种拖延模式,由于对象的创建或者数据的计算会花费高昂的代价,因此页面会延迟对这一类对象的创建。