jQuery源码分析10: jQuery.extend

来源:互联网 发布:apache ab 测试报告 编辑:程序博客网 时间:2024/05/02 02:05
jQuery源码分析10: jQuery.extend

Description: Merge the contents of two or more objects together into the first object.
用法:
jQuery.extend( target, [ object1 ], [ objectN ] )
jQuery.extend( [ deep ], target, object1, [ objectN ] )

jQuery.extend = jQuery.fn.extend = function() {
    var options, name, src, copy, copyIsArray, clone,
        target = arguments[0] || {},
        i = 1,
        length = arguments.length,
        deep = false;
 
    //< 首先判断argument[0]是否是true/false,若是,则表示进行递归或非递归扩展
    if ( typeof target === "boolean" ) {
        deep = target;
        target = arguments[1] || {};
        // skip the boolean and the target
        i = 2;
    }
 
    //< 当target是非对象,而且也不是函数时重置 target={};
    if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
        target = {};
    }
 
    //< 如果没有target则默认扩展jQuery对象
    if ( length === i ) {
        target = this;
        --i;
    }
 
    //< 遍历argument中要合并的对象将其合并到target中
    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)) ) ) {
                    if ( copyIsArray ) {
                        //< 重置copyIsArray,以便对下一个参数arguments[i+1]重新判断
                        copyIsArray = false;
                        clone = src && jQuery.isArray(src) ? src : [];
                    } 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;
};

jQuery.extend算法描述:
    若typeof argument[0] === 'Boolean'时,则从第二个参数开始考虑;
    若argument[0]判断完成且此时arguments中除此以外只有一个参数,则默认target指向jQuery对象,即默认扩展jQuery对象;
    若target是非对象,而且也不是函数时重置 target={};
    遍历object1[, ..., objectN]将每一个对象中的所有属性都copy到target中同名属性中.
      src = target[ name ];
      copy = options[ name ];
      若deep && copy === true则:
        若jQuery.isPlainObject(copy)===true,则clone=src&&jQuery.isPlainObject(src)?src:{};
        若jQuery.isArray(copy)===true,则clone=src&&jQuery.isArray(src)?src:[];
        然后递归调用target[name]=jQuery.extend(deep,clone,copy);
      否则,target[name]=copy;
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信好友群群主把你踢出房间怎么办 我被车撞了对方把现场破坏该怎么办 美术生专业分可以文化分不行怎么办 小狗又吐又拉不吃东西怎么办 狗狗把脖子挠破了怎么办 几分钟我的手机疯狂收到短信怎么办 初中孩子沉迷动漫及画动漫画怎么办 打仗在派出所保释出来人跑了怎么办 贴门槛石瓷砖贴多了要怎么办 建设银行中职学生资助卡丢了怎么办 建行网银u盾丢了怎么办 深水区换气时喝了口水怎么办 撞到别人车了 我走了 怎么办 自己班同学被自己取好多外号怎么办 刚学会走路的宝宝脚外八字怎么办 宝宝两岁走路膝盖弯曲不直怎么办 一岁多的宝宝走路o型腿怎么办 21个月的宝宝走路o型腿怎么办 宝宝十一个月了0型腿怎么办 14个月宝宝o型腿怎么办 深蹲了三个月大腿变粗了怎么办 脚踢球时被踢肿了变紫了怎么办 没钱去健身房想要练出好身材怎么办 群里有人发反政府视频怎么办 部队取消番号后之前军人档案怎么办 新疆武警黄金部队新兵改革后怎么办 别人偷了自己的东西没有证据怎么办 家里项链被邻居偷了没有证据怎么办 知道是谁偷钱都是没有证据怎么办 武警驾照开地方车被交警拦了怎么办 双手擦了纤体瘦身膏辣疼怎么办 乳房全切术后切口裂开化脓怎么办 擦了锁水的霜之后出汗怎么办 用完瘦脸霜感觉脸部又痒又烧怎么办 嘴角起好多的小炮泡怎么办快好 DNF龙腾光环领错角色怎么办 海盗来了卡在新手奖励怎么办 海盗来了获得新手奖励卡了怎么办 魔域帐号忘了哪个区的了怎么办 魔域口袋版幻兽栏满了怎么办 苹果平板的密码和邮箱都忘了怎么办