jQuery中的编程范式详解(8)

Object.extend = function(destination, source) {
    for (var property in source) {
      destination[property] = source[property];
    }
    return destination;
  }

就是Map之间的一个覆盖运算, 但很管用, 在jQuery库中也得到了延用. 这个操作类似于mixin, 在jQuery中是代码重用的主要技术手段---没有继承也没什么大不了的.

11. 名称映射: 一切都是数据

代码好不好, 循环判断必须少. 循环和判断语句是程序的基本组成部分, 但是优良的代码库中却往往找不到它们的踪影, 因为这些语句的交织会模糊系统的逻辑主线, 使我们的思想迷失在疲于奔命的代码追踪中. jQuery本身通过each, extend等函数已经极大减少了对循环语句的需求, 对于判断语句, 则主要是通过映射表来处理. 例如, jQuery的val()函数需要针对不同标签进行不同的处理, 因此定义一个以tagName为key的函数映射表

复制代码 代码如下:

valHooks: { option: {get:function(){}}}


这样在程序中就不需要到处写

复制代码 代码如下:

if(elm.tagName == 'OPTION'){
     return ...;
   }else if(elm.tagName == 'TEXTAREA'){
     return ...;
   }


可以统一处理

复制代码 代码如下:

(valHooks[elm.tagName.toLowerCase()] || defaultHandler).get(elm);


  
映射表将函数作为普通数据来管理, 在动态语言中有着广泛的应用. 特别是, 对象本身就是函数和变量的容器, 可以被看作是映射表. jQuery中大量使用的一个技巧就是利用名称映射来动态生成代码, 形成一种类似模板的机制. 例如为了实现myWidth和myHeight两个非常类似的函数, 我们不需要

复制代码 代码如下:

jQuery.fn.myWidth = function(){
      return parseInt(this.style.width,10) + 10;
    }
   
    jQuery.fn.myHeight = function(){
      return parseInt(this.style.height,10) + 10;
    }


而可以选择动态生成

复制代码 代码如下:

jQuery.each(['Width','Height'],function(name){
      jQuery.fn['my'+name] = function(){
        return parseInt(this.style[name.toLowerCase()],10) + 10;
      }
    });


 
12. 插件机制:其实我很简单   

jQuery所谓的插件其实就是$.fn上增加的函数, 那这个fn是什么东西?

复制代码 代码如下:

(function(window,undefined){
    // 内部又有一个包装
    var jQuery = (function() {
      var jQuery = function( selector, context ) {
            return new jQuery.fn.init( selector, context, rootjQuery );
        }
       ....
      // fn实际就是prototype的简写
      jQuery.fn = jQuery.prototype = {
          constructor: jQuery,
          init: function( selector, context, rootjQuery ) {...  }
      }
   
      // 调用jQuery()就是相当于new init(), 而init的prototype就是jQuery的prototype
      jQuery.fn.init.prototype = jQuery.fn;
   
      // 这里返回的jQuery对象只具备最基本的功能, 下面就是一系列的extend
      return jQuery;
    })(); 
    ...
     // 将jQuery暴露为全局对象
    window.jQuery = window.$ = jQuery;
})(window);

显然, $.fn其实就是jQuery.prototype的简写.
 
无状态的插件仅仅就是一个函数, 非常简单.

复制代码 代码如下:

// 定义插件
  (function($){
      $.fn.hoverClass = function(c) {
          return this.hover(
              function() { $(this).toggleClass(c); }
          );
      };
  })(jQuery);
 
  // 使用插件
  $('li').hoverClass('hover');


 
对于比较复杂的插件开发, jQuery UI提供了一个widget工厂机制,

复制代码 代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgxsgf.html