设计模式知识连载(42)---惰性模式:

<body>


<h3>设计模式知识连载(42)---惰性模式:</h3>
<p>
    减少每次代码执行时的重复性的分支判断,通过对对象重定义来屏蔽原对象中的分支判断
</p>

<hr>
<button id = 'btn'>点击</button>

<script type="text/javascript">



    /**
    *   案例一:,方式一:初始
    */
    // // // 单体模式定义命名空间
    // var A = {} ;
    // // 添加绑定事件方法on
    // 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' + fn] = fn ;
    //  }
    // }
    // var btn = document.getElementById('btn') ;
    // A.on(btn, 'click', function() {
    //  console.log('111') ;
    // }) ;

    /**
    *   案例一:,方式二:进阶
    */
    // // 单体模式定义命名空间
    // var A = {} ;
    // // 添加绑定事件方法on
    // A.on = (function(dom, type, fn) {
    //  // 如果支持addEventListener方法
    //  if(document.addEventListener) {
    //      // 返回重新定义方法
    //      return function(dom, type, fn) {
    //          dom.addEventListener(type, fn, false) ;
    //      }
    //  // 如果支持attachEvent方法(IE)    
    //  }else if(document.attachEvent) {
    //      // 返回重新定义方法
    //      return function(dom, type, fn) {
    //          dom.attachEvent('on' + type, fn) ;
    //      }
    //  // 定义on方法
    //  }else {
    //      // 返回重新定义方法
    //      return function() {
    //          dom['on' + fn] = fn ;   
    //      }
    //  }
    // })() ;

    // console.log(A.on) ;



    /**
    *   案例一:,方式三:进阶
    */
    // 单体模式定义命名空间
    var A = {} ;
    // 添加绑定事件方法on
    A.on = function(dom, type, fn) {
        // 如果支持addEventListener方法
        if(dom.addEventListener) {
            // 显示重新定义on方法
            A.on = function(dom, type, fn) {
                dom.addEventListener(type, fn, false) ;
            }

        // 如果支持attachEvent方法(IE)    
        }else if(dom.attachEvent) {
            // 显示重新定义on方法
            A.on = function(dom, type, fn) {
                dom.attachEvent('on' + type, fn) ;
            }
        // 定义on方法
        }else {
            // 显示重新定义on方法
            A.on = function(dom, type, fn) {
                dom['on' + fn] = fn ;   
            }
        }
        // 执行重新定义on方法
        A.on(dom, type, fn) ;
    } ;

    // 测试用例
    var btn = document.getElementById('btn') ;
    A.on(btn, 'click', function() {
        console.log('111') ;
    }) ;




    /**
    *   案例二:创建XHR对象,方式一:初始
    */
    // 创建XHR对象
    // function createXHR() {
    //  // 标准浏览器
    //  if(typeof XMLHttpRequest != 'undefined') {
    //      return new XMLHttpRequest() ;
    //  // IE浏览器
    //  }else if(typeof ActiveXObject != 'undefined') {
    //      if(typeof arguments.callee.activeXString != 'string') {
    //          var versions = ['MSXML2.XMLHttp.6.0', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp'] ;
    //          var i = 0 ;
    //          var len = versions.length ;
    //          // 遍历并设置版本
    //          for(; i < len; i++) {
    //              try {
    //                  new ActiveXObject(versions[i]) ;
    //                  arguments.callee.activeXString = versions[i] ;
    //                  break ;
    //              }catch(e) {

    //              }
    //          }
    //      }
    //      return new ActiveXObject(arguments.callee.activeXString) ;
    //  // 对不支持的浏览器抛出错误提示   
    //  }else {
    //      throw new Error('您的浏览器并不支持Ajax') ;
    //  }
    // }



    /**
    *   案例二:创建XHR对象,方式二:进阶
    *   加载时损失性能,但是第一次调用时不损失性能
    */
    // 创建XHR对象
    // var createXHR = (function () {
    //  // 标准浏览器
    //  if(typeof XMLHttpRequest != 'undefined') {
    //      return function() {
    //          return new XMLHttpRequest() ;
    //      }
    //  // IE浏览器
    //  }else if(typeof ActiveXObject != 'undefined') {
    //      return function() {
    //          if(typeof arguments.callee.activeXString != 'string') {
    //              var versions = ['MSXML2.XMLHttp.6.0', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp'] ;
    //              var i = 0 ;
    //              var len = versions.length ;
    //              // 遍历并设置版本
    //              for(; i < len; i++) {
    //                  try {
    //                      new ActiveXObject(versions[i]) ;
    //                      arguments.callee.activeXString = versions[i] ;
    //                      break ;
    //                  }catch(e) {

    //                  }
    //              }
    //          }
    //          return new ActiveXObject(arguments.callee.activeXString) ;
    //      }

    //  // 对不支持的浏览器抛出错误提示   
    //  }else {
    //      return function() {
    //          throw new Error('您的浏览器并不支持Ajax') ;
    //      }

    //  }
    // })() ;



    /**
    *   案例二:创建XHR对象,方式三:进阶
    *   加载时不损失性能,但是第一次调用时损失性能
    */

    function createXHR() {
        // 标准浏览器
        if(typeof XMLHttpRequest != 'undefined') {
            createXHR = function() {
                return new XMLHttpRequest() ;
            }
        // IE浏览器
        }else if(typeof ActiveXObject != 'undefined') {
            createXHR = function() {
                if(typeof arguments.callee.activeXString != 'string') {
                    var versions = ['MSXML2.XMLHttp.6.0', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp'] ;
                    var i = 0 ;
                    var len = versions.length ;
                    // 遍历并设置版本
                    for(; i < len; i++) {
                        try {
                            new ActiveXObject(versions[i]) ;
                            arguments.callee.activeXString = versions[i] ;
                            break ;
                        }catch(e) {

                        }
                    }
                }
                return new ActiveXObject(arguments.callee.activeXString) ;
            }

        // 对不支持的浏览器抛出错误提示   
        }else {
            createXHR() {
                throw new Error('您的浏览器并不支持Ajax') ;
            }
        }
        return createXHR() ;
    }

</script>    

</body>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值