jQuery.extend是jQuery最重要的方法之一,下面看看jQuery是怎样实现扩展操作的
 // 如果传入一个对象,这个对象的属性会被添加到jQuery对象中

 // 如果传入两个或多个对象,所有对象的属性会被添加到第一个对象中

 // 如果想合并两个对象,则可以这样用: $.extend({}, obj1, obj2);

 // 如果第一个参数是true,则执行深拷贝(迭代合并)

 jQuery.extend = jQuery.fn.extend = function() {
var src, copyIsArray, copy, name, options, clone,
target = arguments[0] || {}, // 获取第一个参数,第1个参数选择是否进行深拷贝
i = 1,
length = arguments.length,
deep = false; // 处理深拷贝
if ( typeof target === "boolean" ) {
deep = target;
// 跳过第一个boolean值
target = arguments[ i ] || {}; // i == 1
i++;
} // 如果target是一个非object且非function (是string或其他类型,可能要深拷贝)
if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
target = {};
} // 如果只有一个参数,则扩展jQuery对象自己
if ( i === length ) {
target = this;
i--;
}
for ( ; i < length; i++ ) {
// 只处理非null或undefined的值
if ( (options = arguments[ i ]) != null ) {
// 开始扩展基类对象
for ( name in options ) {
src = target[ name ];
copy = options[ name ];
// 防止一个环形链,造成循环引用
if ( target === copy ) {
continue;
}
// 如果要执行纯对象的深拷贝或拷贝Array时,要递归jQuery.extend if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
if ( copyIsArray ) {
copyIsArray = false; // 确保src是一个数组
clone = src && jQuery.isArray(src) ? src : [];
} else { // 确保src是一个纯对象
clone = src && jQuery.isPlainObject(src) ? src : {};
}
// 递归调用jQuery.extend来实现深拷贝
target[ name ] = jQuery.extend( deep, clone, copy ); // 丢弃undefined值
} else if ( copy !== undefined ) {
// 执行拷贝 target[ name ] = copy;
}
}
}
}
// 返回扩展后的对象
return target;
};
 
 
通过jQuery.extend方法可以为jQuery或其他对象进行属性扩展操作。对于纯对象可选择执行深拷贝,对于数组是一定执行深拷贝。
jQuery的大部分功能都通过此方法进行扩展,也可以此为jQuery扩展插件。
jQuery.extend({}),此时target为 jQuery.prototype,为jQuery扩展静态属性或方法,jQuery内部也是以此方法进行。
jQuery().extend({}),此时target为jQuery对象本身,给jQuery对象扩展属性或方法。

jQuery 源码分析4: jQuery.extend的更多相关文章

  1. jQuery源码分析之=>jQuery的定义

    最近写前段的代码比较多,jQuery是用的最多的一个对象,但是之前几次看了源码,都没搞清楚jQuery是怎么定义的,今天终于看明白怎么回事了.记录下来,算是一个新的开始吧. (文中源码都是jQuery ...

  2. jQuery 源码分析3: jQuery.fn/ jQuery.prototype

    // 建立方法实例,提高方法访问的速度(避免在原型链上搜索) var deletedIds = []; var slice = deletedIds.slice; var concat = delet ...

  3. jQuery 源码分析6: jQuery 基本静态方法(二)

    jQuery.extend({ // 遍历obj的所有值 // args 这参数只能内部调用的会用到 // 注意到,如果回调函数调用失败会直接跳出并中止遍历 // 当有args数组时,使用apply调 ...

  4. jQuery 源码分析5: jQuery 基本静态方法(一)

    jQuery在初始化过程中会为自己扩展一些基本的静态方法和属性,以下是jQuery 1.11.3版本 239 ~ 564行间所扩展的静态属性和方法   jQuery.extend({ // 为每个jQ ...

  5. jQuery 源码分析2: jQuery.fn.init

    //jQuery.fn.intit 中使用到的外部变量: // 判断是否为HTML标签或#id rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w ...

  6. 六.jQuery源码分析之jQuery原型属性和方法

    97 jQuery.fn = jQuery.prototype = { 98 constructor: jQuery, 99 init: function( selector, context, ro ...

  7. jQuery源码分析-each函数

    本文部分截取自且行且思 jQuery.each方法用于遍历一个数组或对象,并对当前遍历的元素进行处理,在jQuery使用的频率非常大,下面就这个函数做了详细讲解: 复制代码代码 /*! * jQuer ...

  8. jQuery源码分析系列

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...

  9. [转] jQuery源码分析-如何做jQuery源码分析

    jQuery源码分析系列(持续更新) jQuery的源码有些晦涩难懂,本文分享一些我看源码的方法,每一个模块我基本按照这样的顺序去学习. 当我读到难度的书或者源码时,会和<如何阅读一本书> ...

随机推荐

  1. 你的iOS静态库该减肥了

    我有点震惊,国内的具有极少的有关静态库开发的内容,除了一些简单的如何教你开发,而且是原创还是copy,谁知道呢?细思极恐,不扯那么远了,这里就已切身的爬坑经历提供几个静态库瘦身的方案. 公司最近开发完 ...

  2. 使用ApplicationLoader中出现报错:The IPA is invalid. It does not inlude a Payload directory

    问题处理方法: 1.将achieve的.app后缀的软件包放在一个payload的文件夹中 2.压缩该文件夹,改变.zip后缀为.ipa 3.使用applicationLoader上传该文件  

  3. iOS- iPad UIPopoverController

    在IPAD开发中,有一个很有趣的视图控制器,UIPopoverControllr,它的初始化必须要设置一个"内容视图",相当于它本身只是作为一个“容器”,而显示的内容还需要另外一个 ...

  4. nape.geom.MarchingSquares

    Nape中的MarchingSquares类很简单,只有一个静态函数run,不过这对绘制那些简单的形状来说,已经足够了(当然MarchingSquares能做的不只这些).下面是这个run方法的结构: ...

  5. 【转】bt协议的详细分析

    转自:https://baoz.net/bt-protocol/ 一 BT系统的组成结构 1 普通的Web服务器:        例如Apache或IIS服务器 2 一个静态的种子文件:     即. ...

  6. OpenCV 显示Mat矩阵异常 显示“程序停止工作” 解决办法

    笔者调试OpenCV 程序时,在使用标准输出显示Mat矩阵时,编译没有错误,但每次运行都弹出程序停止工作的对话框.google之,得到解决方案. 程序如下: #include <iostream ...

  7. win7(64bit)python相关环境模块搭建

    包括Python,eclipse,jdk,pydev,pip,setuptools,beautifulsoup,pyyaml,nltk,mysqldb的下载安装配置. **************** ...

  8. 应用:ValueStack

    理解ValueStack的基本机制!对各种现象作出解释. ValueStack实际上就是对OGNL的封装,OGNL主要的功能就是赋值与取值,Struts2正是通过ValueStack来进行赋值与取值的 ...

  9. Linux-PAM(Linux下的密碼認證和安全机制)系統管理員指南(中文版)

    he Linux-PAM 系统管理员指南作者:Andrew G. Morgan, morgan@linux.kernel.org翻译:孙国清(Thomas Sun),thomassun@yeah.ne ...

  10. hellogcc -100GDB技巧

    https://github.com/hellogcc/100-gdb-tips/blob/master/README.md