jQuery.extend = jQuery.fn.extend = function() {
var options, name, src, copy, copyIsArray, clone,
target = arguments[0] || {}, //传来的第一个参数是要合并的对象
i = 1,
length = arguments.length, //要合并的对象个数
deep = false; //一般不是深拷贝
//这三个if处理不同的传参情况
// Handle a deep copy situation
if ( typeof target === "boolean" ) { //获取合并的目标和遍历的位置
deep = target;
target = arguments[1] || {};
// skip the boolean and the target
i = 2;
}
// 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 ( length === i ) { //传了一个参数或者一个参数一个boolean
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 = jQuery.isArray(copy)) ) ) { //判断copy是一个plain object的情况或者是一个纯array的情况(而不是类array)
if ( copyIsArray ) {
copyIsArray = false;
clone = src && jQuery.isArray(src) ? src : []; //克隆一份src
} else {
clone = src && jQuery.isPlainObject(src) ? src : {};
}
// Never move original objects, clone them
target[ name ] = jQuery.extend( deep, clone, copy ); //递归调用,但是不要在本来的对象上操作,clone出一个对象再此之上操作.把copy搁到clone里面
// Don't bring in undefined values
} else if ( copy !== undefined ) { //不是深拷贝,那直接等价过去
target[ name ] = copy;
}
}
}
}
// Return the modified object
return target;
};
jQuery源码——extend()函数
最新推荐文章于 2021-05-21 18:37:13 发布