jQuery.extend简单分析
jQuery.extend = jQuery.fn.extend = function() {
var options, name, src, copy, copyIsArray, clone,
target = arguments[ 0 ] || {},//把第一个参数赋值给target
i = 1, //从第几个参数开始向target对象合并
length = arguments.length,//传入参数的个数
deep = false;//是否进行深复制
// Handle a deep copy situation处理深复制的情况
if ( typeof target === "boolean" ) {
deep = target;
// Skip the boolean and the target如果一个参数为布尔值,判断时候进行深复制,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 = {}; //如果target不是一个对象也不是函数,
}
// Extend jQuery itself if only one argument is passed
// 如果只有一个参数,把jQuery或jQuery.fn本身作为target,把参数对象合并到jQuery或jQuery.fn中区
// 如果有多个对象参数,则是把后面的对象合并到第一个对象中去(这里假设没有deep参数)
if ( i === length ) {
target = this;
i--;
}
for ( ; i < length; i++ ) {
// Only deal with non-null/undefined values
// 只有当参数的值不是null的时候才进行处理
if ( ( options = arguments[ i ] ) != null ) {
// Extend the base object
for ( name in options ) {//遍历options中的属性
src = target[ name ];
copy = options[ name ];
// Prevent never-ending loop
// 防止死循环,比如extend(true, target, {'target':target});
if ( target === copy ) {
continue;
}
// Recurse if we're merging plain objects or arrays
if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
( copyIsArray = jQuery.isArray( copy ) ) ) ) {
//deep值为true,copy存在并且是个存粹的对象或者一个数组的时候进行深复制
if ( copyIsArray ) {
//数组
copyIsArray = false;
clone = src && jQuery.isArray( src ) ? src : [];
} else {
//存粹对象
clone = src && jQuery.isPlainObject( src ) ? src : {};
}
// Never move original objects, clone them
// 递归调用,吧copy复制给clone
target[ name ] = jQuery.extend( deep, clone, copy );
// Don't bring in undefined values
// 其他不知undefined的值
} else if ( copy !== undefined ) {
target[ name ] = copy;
}
}
}
}
// Return the modified object
return target;
};
jQuery.extend ()
- 第一个参数如果是布尔值,则用来判断是否进行深复制
- 如果只传入一个对象,那么就把这个对象复制给全局对象
- 如果传入多个对象 ,那么就是吧后面几个对象的值复制给第一个对象
jQuery.extend是复制给全局对象
jQuery.fn.extend是复制给jQuery的原型