jQuery承袭的实现(extends)
jQuery继承的实现(extends)jQuery中的extend方法通过不同的参数实现了几种不同的继承方法:1.extend(src)ta
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中到处体现这一点