jQuery1.2.1架构分析----基础函数extend方法(1)

来源:百度文库 编辑:神马文学网 时间:2024/05/01 06:52:28
 在开始我们的jQuery之旅前,让我们首先看几个至关重要的函数。实际上,这些函数在jQuery内部被大量的使用,因此,理解它们,是理解jQuery的基础。

  让我们首先看一下无论是jQuery、Ext还是Prototype等JavaScript框架都会提供的"继承"机制:extend方法,相对于其他的javascript框架,jQuery提供的extend方法更加精巧,功能强大,并且提供了深度复制和多层继承的特性。需要注意的是,jQuery和jQuery对象都实现了extend方法。
extend通过几种不同的参数实现了不同的”继承“方法:
1.extend(src)
将src对象的属性和方法逐一复制给jQuery或jQuery对象
2.extend(dest,src1,src2,src3...srcN)
将src1、src2...对象的属性和方法逐一复制给dest对象,需要注意的是,在复制的过程中,排在后面的参数(对象)将会覆盖排在前面的参数的属性和方法;实际上,该方法和后面的方法3都提供了一种“深度继承”的方法,即:参数一表示的对象可以通过该方法一次实现逐一按层次的父类继承。
如下图所示:
srcN
...
src3
src2
src1
dest
使用该方法,可以一次将”继承“dest的多个父类,需要注意的是src3提供的属性和方法由可能会被src2,src1重载。
3.extend(boolean,dest,src1,src2...)
与其他的类库不同的是,jQuery的extend方法提供了“深层拷贝”的功能,如果你传入的第一个参数为boolean型变量,则该变量为深层拷贝的标志,第二个参数为extend方法的目标对象,其余参数为需要进行继承的“父类”。如果第一个参数的值为true(深层拷贝),并且dest和src元素都包括相同名称的对象属性,则对该对象属性的方法和属性再进行一次复制。

最后,让我们看一下代码加深一下对extend的理解:
jQuery.extend = jQuery.fn.extend = function() {
  var target = arguments[0] || {}, a = 1, al = arguments.length, deep = false;
  /*如果第一个参数为boolean值,则取第二个参数为目标对象*/
  if ( target.constructor == Boolean ) {
    deep = target;
    target = arguments[1] || {};
  }
  /*如果参数长度为1,则将参数表示的对象的属性和方法复制给jQuery或jQuery对象*/
  if ( al == 1 ) {
    target = this;
    a = 0;
  }
  var prop;
  for ( ; a < al; a++ )
    if ( (prop = arguments[a]) != null )
      for ( var i in prop ) {
      /*防止死循环*/
        if ( target == prop )
          continue;
        /*深度继承的实现*/
        if ( deep && typeof prop == 'object' && target )
          jQuery.extend( target, prop );
        /*正常情况下的继承实现*/
        else if ( prop != undefined )
          target = prop;
      }
  return target;
};