美文网首页
$.extend() 方法分析

$.extend() 方法分析

作者: day_day_up | 来源:发表于2017-04-28 15:38 被阅读0次
jquery定义了$.extend方法主要有以下几个常用作用

1.合并两个对象的值
$.extend(obj1,obj2) //改变了obj1
$.extend({},obj1,obj2) //未改变了obj1
2.在$上拓展方法

$.extend({
    addMyClass: function(){
    }
})

3.在一个对象上拓展一些方法

$.extend(Util,{
    addMyClass: function(){
    }
})
源码
var extend = function() {
    var src, copyIsArray, copy, name, options, clone,
        target = arguments[0] || {},
        i = 1,
        length = arguments.length,
        deep = false;

    // Handle a deep copy situation
    // target 是传入的第一个参数
    // 如果第一个参数是布尔类型,则表示是否要深递归,
    if (typeof target === "boolean") {
        deep = target;
        target = arguments[1] || {};
        // skip the boolean and the target
        // 如果传了类型为 boolean 的第一个参数,i 则从 2 开始
        i = 2;
    }

    // Handle case when target is a string or something (possible in deep copy)
    // 如果传入的第一个参数是 字符串或者其他
    if (typeof target !== "object" && !jQuery.isFunction(target)) {
        target = {};
    }

    // extend jQuery itself if only one argument is passed
    // 如果参数的长度为 1 ,表示是 jQuery 静态方法
    if (length === i) {
        target = this;
        --i;
    }

    // 可以传入多个复制源
    // i 是从 1或2 开始的
    for (; i < length; i++) {
        // Only deal with non-null/undefined values
        // 将每个源的属性全部复制到 target 上
        if ((options = arguments[i]) != null) {
            // Extend the base object
            for (name in options) {
                // src 是源(即本身)的值
                // copy 是即将要复制过去的值
                src = target[name];
                copy = options[name];

                // Prevent never-ending loop
                // 防止有环,例如 extend(true, target, {'target':target});
                if (target === copy) {
                    continue;
                }

                // Recurse if we're merging plain objects or arrays
                // 这里是递归调用,最终都会到下面的 else if 分支
                // jQuery.isPlainObject 用于测试是否为纯粹的对象
                // 纯粹的对象指的是 通过 "{}" 或者 "new Object" 创建的
                // 如果是深复制
                if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) {
                    // 数组
                    if (copyIsArray) {
                        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
    // 返回新的 target
    // 如果 i < length ,是直接返回没经过处理的 target,也就是 arguments[0]
    // 也就是如果不传需要覆盖的源,调用 $.extend 其实是增加 jQuery 的静态方法
    return target;
};

相关文章

  • $.extend() 方法分析

    jquery定义了$.extend方法主要有以下几个常用作用 1.合并两个对象的值$.extend(obj1,ob...

  • jQuery.extend 函数使用详解

    jQuery.extend 函数使用详解 JQuery的extend扩展方法:Jquery的扩展方法extend是...

  • JQ第三部分源码学习

    jQuery中的集成方法$.extend()和$.fn.extend$.extend()是扩展插件的方法,作为工具...

  • JQuery写拓展

    基础 $.extend()扩展JQuery静态方法,$.fn.extend()扩展JQuery实例方法静态方法: ...

  • extend , $.extend

    extend $.extend(为jquery类添加静态方法)

  • 合并对象

    使用JQuery的extend方法方法定义:jQuery.extend([deep], target, objec...

  • $ 与extend

    原文: jQuery.extend 函数使用详解 JQuery的extend扩展方法:Jquery的扩展方法ext...

  • jQuery中的 $.extend 和 $.fn.extend

    $.extend 是拓展 jQuery 类的方法 $.fn.extend 是拓展jQuery对象的方法 所谓jQu...

  • LinqToExcel.Extend 源码分析

    废话不多说,我们直接来分析源码,首先我们查看目录结构 目录结构功能 Extend 通用扩展方法 Paramete...

  • jQuery.extend 函数使用详解

    JQuery的extend扩展方法:Jquery的扩展方法extend是我们在写插件的过程中常用的方法,该方法有一...

网友评论

      本文标题:$.extend() 方法分析

      本文链接:https://www.haomeiwen.com/subject/kcfazttx.html