jQuery.extend簡(jiǎn)單分析
jQuery.extend = jQuery.fn.extend = function() {
var options, name, src, copy, copyIsArray, clone,
target = arguments[ 0 ] || {},//把第一個(gè)參數(shù)賦值給target
i = 1, //從第幾個(gè)參數(shù)開始向target對(duì)象合并
length = arguments.length,//傳入?yún)?shù)的個(gè)數(shù)
deep = false;//是否進(jìn)行深復(fù)制
// Handle a deep copy situation處理深復(fù)制的情況
if ( typeof target === "boolean" ) {
deep = target;
// Skip the boolean and the target如果一個(gè)參數(shù)為布爾值温自,判斷時(shí)候進(jìn)行深復(fù)制,target跳過(guò)第一個(gè)參數(shù)
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不是一個(gè)對(duì)象也不是函數(shù),
}
// Extend jQuery itself if only one argument is passed
// 如果只有一個(gè)參數(shù),把jQuery或jQuery.fn本身作為target锌妻,把參數(shù)對(duì)象合并到j(luò)Query或jQuery.fn中區(qū)
// 如果有多個(gè)對(duì)象參數(shù),則是把后面的對(duì)象合并到第一個(gè)對(duì)象中去(這里假設(shè)沒(méi)有deep參數(shù))
if ( i === length ) {
target = this;
i--;
}
for ( ; i < length; i++ ) {
// Only deal with non-null/undefined values
// 只有當(dāng)參數(shù)的值不是null的時(shí)候才進(jìn)行處理
if ( ( options = arguments[ i ] ) != null ) {
// Extend the base object
for ( name in options ) {//遍歷options中的屬性
src = target[ name ];
copy = options[ name ];
// Prevent never-ending loop
// 防止死循環(huán),比如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存在并且是個(gè)存粹的對(duì)象或者一個(gè)數(shù)組的時(shí)候進(jìn)行深復(fù)制
if ( copyIsArray ) {
//數(shù)組
copyIsArray = false;
clone = src && jQuery.isArray( src ) ? src : [];
} else {
//存粹對(duì)象
clone = src && jQuery.isPlainObject( src ) ? src : {};
}
// Never move original objects, clone them
// 遞歸調(diào)用垮耳,吧copy復(fù)制給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 ()
- 第一個(gè)參數(shù)如果是布爾值,則用來(lái)判斷是否進(jìn)行深復(fù)制
- 如果只傳入一個(gè)對(duì)象遂黍,那么就把這個(gè)對(duì)象復(fù)制給全局對(duì)象
- 如果傳入多個(gè)對(duì)象 终佛,那么就是吧后面幾個(gè)對(duì)象的值復(fù)制給第一個(gè)對(duì)象
jQuery.extend是復(fù)制給全局對(duì)象
jQuery.fn.extend是復(fù)制給jQuery的原型