extend函数
来源:互联网 发布:淘宝网注册账号 编辑:程序博客网 时间:2024/06/06 02:50
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;};