读书人

jQuery承袭的实现(extends)

发布时间: 2012-11-23 00:03:43 作者: rapoo

jQuery继承的实现(extends)

jQuery中的extend方法通过不同的参数实现了几种不同的继承方法:

1.extend(src) target = {};

// extend jQuery itself if only one argument is passed /*如果参数长度为1,则将参数表示的对象的属性和方法复 制给jQuery本身*/
if ( length == i ) {
target = this;
--i;
}

for ( ; i < length; i++ )
// Only deal with non-null/undefined values当参数都为非空时,
if ( (options = arguments[ i ]) != null )
// Extend the base object
for ( var name in options ) {
var src = target[ name ], copy = options[ name ];

// Prevent never-ending loop /*防止死循环*/
if ( target === copy )
continue;

// Recurse if we're merging object values/*深度继承的实现*/
if ( deep && copy && typeof copy == "object" && !copy.nodeType )
target[ name ] = jQuery.extend( deep,
// Never move original objects, clone them
src || ( copy.length != null ? [ ] : { } )
, copy );

// Don't bring in undefined values /*正常情况下的继承实现*/
else if ( copy !== undefined )
target[ name ] = copy;

}

// Return the modified object
return target;
};

注意:

在这里还有一个特殊的地方,就是在函数开头的地方有jQuery.extend = jQuery.fn.extend,而在程序的前面已经将jQuery.prototype赋值给jQuery.fn了,所以在后面的调用中会出现jQuery.extend()和jQuery.fn.extend()的不同调用,这两个方法调用产生的结果也不一样,jQuery.extend()的调用并不会把方法扩展到对象的实例上,引用它的方法也需要通过jQuery类来实现,如jQuery.init(),而jQuery.fn.extend()的调用把方法扩展到了对象的prototype上,所以实例化一个jQuery对象的时候,它就具有了这些方法,这是很重要的,在jQuery.js中到处体现这一点