var extend = function () {
//源对象(即将要往目标对象合并的对象)
var options,
//源对象属性-键
name,
//目标对象属性-值(键 : name)
src,
//源对象属性-值 (键 : name)
copy,
//源对象属性-键 是否为数组(bool类型)
copyIsArray,
clone,
//目标对象(即最终返回的被合并后对象)
target = arguments[0] || {},
//源对象的位置
i = 1,
//参数个数
length = arguments.length,
//是否深度复制
deep = false;
// 第0个参数是否bool,如果为true则是深度拷贝
if (typeof target === "boolean") {
deep = target;
//如果为bool,则目标对象为第1个参数
target = arguments[1] || {};
// 跳过bool和目标对象
i = 2;
}
// 如果目标对象不是object,并且不是函数(函数也是对象)
if (target !== "object" && !jQuery.isFunction(target)) {
target = {};
}
// 如果参数个数 为 i 即除第一个bool值只有一个参数
// 如extend(true,{object})或extend({object})
if (length === i) {
//目标对象是this
target = this;
--i;
}
//核心代码
for (; i < length; i++) {
// 只有当源对象不为null的时候才拷贝
if ((options = arguments[i]) != null) {
//遍历源对象
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是数组
if (copyIsArray) {
copyIsArray = false;
//如果src不为空并且为数组,clone =src,否则定义一个空数组
clone = src && jQuery.isArray(src) ? src : [];
}
//如果copy为Object
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;
};
extend函数
最新推荐文章于 2023-12-08 06:58:17 发布