解读jquery的extend

jQuery的extend方法很有用,jquery的很多工具方法,和实例方法都是通过extend实现的。我们一起来看一下

这个方法是怎么写的。

  jQuery.extend = jQuery.fn.extend = function() {

var options, name, src, copy, copyIsArray, clone,

3target = arguments[0] || {},

i = 1,

length = arguments.length,

deep = false;

// Handle a deep copy situation

if ( typeof target === "boolean" ) {

deep = target;

// skip the boolean and the target

target = arguments[ i ] || {};

i++;

}

// Handle case when target is a string or something (possible in deep copy)

if ( typeof target !== "object" && !jQuery.isFunction(target) ) {

target = {};

}

// extend jQuery itself if only one argument is passed

if ( i === length ) {

target = this;

i--;

}

for ( ; i < length; i++ ) {

// Only deal with non-null/undefined values

if ( (options = arguments[ i ]) != null ) {

// Extend the base object

for ( name in options ) {

src = target[ name ];

copy = options[ name ];

// Prevent never-ending loop

if ( target === copy ) {

continue;

}

// Recurse if we're merging plain objects or arrays

if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = 29jQuery.isArray(copy)) ) ) {

if ( copyIsArray ) {

copyIsArray = false;

clone = src && jQuery.isArray(src) ? src : [];

} else {

clone = src && jQuery.isPlainObject(src) ? src : {};

}

// Never move original objects, clone them

target[ name ] = jQuery.extend( deep, clone, 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.fn = jQuery.prototype,所以就是通过jQuery.fn.extend实现向jQuery添加实例方法,通过jQuery.extend向jQuery添加工具方法。

首选通过target = arguments[0] || {}取得第extend的第一个参数为目标对像,后边又判断如果typeof target === "boolean" 如果第一个参数是boolean的话说明是深拷贝,那么目标对像为第二个参数 target = arguments[ i ] || {} ;i++。如果参数只有一个的话那么目录对像就是jQuery或者是jQuery.prototype,

那么以下内容就是遍历除参数,把每个对像参数的属性拷贝到目标对像上,如果第一个参数是true的话就用递归实现深拷贝

相关推荐