jQuery.extend是jQuery最重要的方法之一,下面看看jQuery是怎样实现扩展操作的
  1. // 如果传入一个对象,这个对象的属性会被添加到jQuery对象中
  2.  
  3. // 如果传入两个或多个对象,所有对象的属性会被添加到第一个对象中
  4.  
  5. // 如果想合并两个对象,则可以这样用: $.extend({}, obj1, obj2);
  6.  
  7. // 如果第一个参数是true,则执行深拷贝(迭代合并)
  8.  
  9. jQuery.extend = jQuery.fn.extend = function() {
  10. var src, copyIsArray, copy, name, options, clone,
  11. target = arguments[0] || {}, // 获取第一个参数,第1个参数选择是否进行深拷贝
  12. i = 1,
  13. length = arguments.length,
  14. deep = false;
  15.  
  16. // 处理深拷贝
  17. if ( typeof target === "boolean" ) {
  18. deep = target;
  19. // 跳过第一个boolean值
  20. target = arguments[ i ] || {}; // i == 1
  21. i++;
  22. }
  23.  
  24. // 如果target是一个非object且非function (是string或其他类型,可能要深拷贝)
  25. if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
  26. target = {};
  27. }
  28.  
  29. // 如果只有一个参数,则扩展jQuery对象自己
  30. if ( i === length ) {
  31. target = this;
  32. i--;
  33. }
  34. for ( ; i < length; i++ ) {
  35. // 只处理非null或undefined的值
  36. if ( (options = arguments[ i ]) != null ) {
  37. // 开始扩展基类对象
  38. for ( name in options ) {
  39. src = target[ name ];
  40. copy = options[ name ];
  41. // 防止一个环形链,造成循环引用
  42. if ( target === copy ) {
  43. continue;
  44. }
  45. // 如果要执行纯对象的深拷贝或拷贝Array时,要递归jQuery.extend
  46.  
  47. if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
  48. if ( copyIsArray ) {
  49. copyIsArray = false;
  50.  
  51. // 确保src是一个数组
  52. clone = src && jQuery.isArray(src) ? src : [];
  53. } else {
  54.  
  55. // 确保src是一个纯对象
  56. clone = src && jQuery.isPlainObject(src) ? src : {};
  57. }
  58. // 递归调用jQuery.extend来实现深拷贝
  59. target[ name ] = jQuery.extend( deep, clone, copy );
  60.  
  61. // 丢弃undefined值
  62. } else if ( copy !== undefined ) {
  63. // 执行拷贝
  64.  
  65. target[ name ] = copy;
  66. }
  67. }
  68. }
  69. }
  70. // 返回扩展后的对象
  71. return target;
  72. };
 
 
通过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. 【Stage3D学习笔记续】真正的3D世界(二):显示模型

    虽然我们进入真3D世界了,但是上一章的Demo仍然是显示的一个平面,尽管我们的平面在3D空间中旋转可以看出一点3D透视的效果,但是既然是真3D,就要拿出点3D的样子来! 如果要显示3D模型,我们就要告 ...

  2. PowerDesigner实用技巧小结(4)

    下述十四个技巧,是许多人在大量的数据库分析与设计实践中,逐步总结出来的.对于这些经验的运用,读者不能生帮硬套,死记硬背,而要消化理解,实事求是,灵活掌握.并逐步做到:在应用中发展,在发展中应用. 1. ...

  3. Visual Studio动态代码生成的实现基础

    这篇文章讨论以下3个问题: 1.代码生成器应该做什么 2.大多数代码生成器的缺点 3.动态代码生成实现的基础 代码生成器应该做什么? 我认为,目标是加快项目开发,方式是减少重复代码手工操作,实现是用过 ...

  4. iOS FONT字体名

    下面这段代码可以查看ios中可用的字体,具体那些字体长什么样,可以查看字体册工具. NSArray *familyArray = [UIFont familyNames]; for (id famil ...

  5. perl指针引用

    http://bbs.chinaunix.net/forum-viewthread-tid-570031.html

  6. 类 ArrayBlockingQueue<E>(一个由数组支持的有界阻塞队列。)

    类型参数: E - 在此 collection 中保持的元素类型 所有已实现的接口: Serializable, Iterable<E>, Collection<E>, Blo ...

  7. windows7怎么共享文件夹

    http://jingyan.baidu.com/article/d45ad148f06fef69552b80e6.html

  8. 转--object-C 与lua使用wax交互

    [51CTO独家译文]2011年6月的编程语言排行榜Lua语言一军突起,一举进入前十名.这与一年前苹果决定在iOS系统上使用Lua语言密不可分.但是,你了解如何用Lua语言在iOS上开发应用吗?51C ...

  9. JFinal极速开发实战-业务功能开发-通用表单验证器

    提交表单数据时,需要经过前端的验证才能提交到后台,而后台的验证器再做一道数据的校验,成功之后才能进入action进行业务数据的处理. 在表单数据的验证中,数据类型的验证还是比较固定的.首先是对录入数据 ...

  10. java基础学习总结四(控制语句<顺序、选择、循环>、方法)

    一:结构控制语句 结构控制语句分为3种,顺序语句.选择语句.循环语句. 1:顺序语句 就是自上而下的执行程序,默认执行顺序. 2:选择语句 if结构语句:如果满足条件,则执行该语句. if...els ...