jQuery的extend()方法由于扩展jQuery功能。通常写一个插件,会利用extend传进来的参数来覆盖插件原有的配置。
jQuery的extend()源码如下:
jQuery.extend = jQuery.fn.extend = function() {
var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false;
if (typeof target === "boolean") { // 第一个参数表示是否要深递归,类型是布尔值
deep = target;
target = arguments[1] || {};
i = 2;
}
if (typeof target !== "object" && !jQuery.isFunction(target))
target = {};
if (length === i) {
target = this;
--i;
}
for (; i < length; i++) { // 可以传入多个复制源
if ((options = arguments[i]) != null) {
// 将每个源的属性全部复制到target上
for (name in options) {
src = target[name];
copy = options[name];
if (target === copy) // 防止有环,如 extend(true, target, {'target':target});
continue;
if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) { // 如果是深复制
if (copyIsArray) {
copyIsArray = false;
clone = src && jQuery.isArray(src) ? src : []; // 克隆原来target上的原属性
}
else
clone = src && jQuery.isPlainObject(src) ? src : {};
target[name] = jQuery.extend(deep, clone, copy); // 递归深复制
}
else if (copy !== undefined)
target[name] = copy;
}
}
}
return target;
};