$.extend()的实现源码 --(源码学习1)

时间:2021-07-30 02:54:39
目标:
$.extend({
        add:function(a,b){
            return a + b;
        }
    })
console.log($.add(1,2));
 
是怎么实现可以将add函数挂在jQuery后面?
 
jQuery -v1.12.4
 jQuery.extend = jQuery.fn.extend = function() {
var src, copyIsArray, copy, name, options, clone,
target = arguments[ 0 ] || {},
i = 1,
length = arguments.length,
deep = false; // Handle a deep copy situation
if ( typeof target === "boolean" ) {
deep = target; // skip the boolean and the target
target = arguments[ i ] || {};
i++;
} // 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
if ( i === length ) {
target = this;
i--;
} 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 = 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;
};

分析:

第3行:取到函数add
第23-26行:将this也就是jquery的实例对象,function(selector, context){} 赋值给target.
第31行:将函数add赋值给options,并进行遍历。
第36行:将options = { add:function(a,b){   ... }}的函数赋值给copy.
第60行:通过target[name]=copy; 将jquery的实例添加一个属性add 就成了jQuery['add']=function (a,b){ return a+b};
 
 

随机推荐

  1. POJ3292 Semi-prime H-numbers

    传送门: 刷<数论一本通>时看到的题,简单记录一下. 题目大意(照抄书上的):形如4n+1的数被称为H数,乘法在H数组成的集合内是封闭的.在这个集合中是能被1和本身整除的数叫H-素数,其余 ...

  2. 限制站点目录防止跨站的三种方案(使用open&lowbar;basedir)

    nginx结合php的时候,可以使用open_basedir限制站点目录防止跨站具体实现方法有以下三种:注意:以下三种设置方法均需要PHP版本为5.3或者以上. 方法1)在Nginx配置文件中加入fa ...

  3. MVC ActionResult JsonResult

    以下是ActionResult的继承图: 大概的分类: EmptyResult:表示不执行任何操作的结果 ContentResult :返回文本结果 JavaScriptResult:返回结果为Jav ...

  4. freeswitch

    FreeSWITCH 是一个电话的软交换解决方案,包括一个软电话和软交换机用以提供语音和聊天的产品驱动.FreeSWITCH 可以用作交换机引擎.PBX.多媒体网关以及多媒体服务器等.可以用作一个简单 ...

  5. 在Python中怎么表达True

    在Python中怎么表达True   为False的几种情况 0为False,其他所有数值皆为True 空串("")为False,其他所有字符串皆为True 空list([])为F ...

  6. Unity3D学习笔记(四)Unity的网络基础(C&num;)

    一 网络下载可以使用WWW类下载资源用法:以下载图片为例WWW date = new WWW("<url>");yield return date;texture = ...

  7. Druid、BoneCP、DBCP、C3P0等主流数据库对比

    关键功能 Druid BoneCP DBCP C3P0 Proxool JBoss LRU 是 否 是 否 是 是 PSCache 是 是 是 是 否 是 PSCache-Oracle-Optimiz ...

  8. Spark&colon;读取mysql数据作为DataFrame

    在日常工作中,有时候需要读取mysql的数据作为DataFrame数据源进行后期的Spark处理,Spark自带了一些方法供我们使用,读取mysql我们可以直接使用表的结构信息,而不需要自己再去定义每 ...

  9. 针对 Intellij IDEA 2018&period;2 版本 异常退出问题

    原文:https://blog.csdn.net/weixin_41370091/article/details/81322694 近日刚安装好Intellij IDEA(2018.2 Ultimat ...

  10. Spring所需的Jar包下载

    作者:zhidashang 来源:CSDN 原文:https://blog.csdn.net/zhidashang/article/details/78706027 版权声明:本文为博主原创文章,转载 ...