jQuery1.2.1架构分析----基础函数extend方法(1)
来源:百度文库 编辑:神马文学网 时间:2024/05/22 02:26:01
在开始我们的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;
};
让我们首先看一下无论是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;
};