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;};