1. $.extend(obj1,0bj2,{"name":"s","age":22})
  2. //target 要拷贝到哪个对象上
  3. // i 要执行拷贝的次数
  4. // length 要拷贝的参数的长度
  5. // name 对象参数中属性值
  6. // options 对象参数
  7. // clone 深度拷贝时重名对象属性的拷贝
  8. // target 要拓展的对象
  9.  
  10. jQuery.extend = jQuery.fn.extend = function() {
  11. var src, copyIsArray, copy, name, options, clone,
  12. target = arguments[0] || {}, // 常见用法 jQuery.extend( obj1, obj2 ),此时,target为arguments[0]
  13. i = 1,
  14. length = arguments.length,
  15. deep = false;
  16.  
  17. // Handle a deep copy situation
  18. if ( typeof target === "boolean" ) { // 如果第一个参数为true,即 jQuery.extend( true, obj1, obj2 ); 的情况
  19. deep = target; // 此时target是true
  20. target = arguments[1] || {}; // target改为 obj1
  21. // skip the boolean and the target
  22. i = 2;
  23. }
  24. // 以上处理:如果第一个参数是boolean,第二个参数是target。
  25. // Handle case when target is a string or something (possible in deep copy)
  26. if ( typeof target !== "object" && !jQuery.isFunction(target) ) { // 如果target不是一个对象,设置默认对象。
  27. target = {};
  28. }
  29.  
  30. // extend jQuery itself if only one argument is passed
  31. if ( length === i ) { // 处理这种情况 jQuery.extend(obj),或 jQuery.fn.extend( obj )
  32. target = this; // jQuery.extend时,this指的是jQuery;jQuery.fn.extend时,this指的是jQuery.fn
  33. --i;
  34. }
  35.  
  36. for ( ; i < length; i++ ) {
  37. // Only deal with non-null/undefined values
  38. if ( (options = arguments[i]) != null ) { // 比如 jQuery.extend( , obj2, obj3, ojb4 ),options则为 obj2、obj3...
  39. // Extend the base object
  40. for ( name in options ) {
  41. src = target[ name ];
  42. copy = options[ name ];
  43.  
  44. // Prevent never-ending loop
  45. if ( target === copy ) { // 防止自引用:$.extend(x,{"name1":x});如果 如果target和option[name1]的值一样,会循环迭代。
  46. //看网上还有说应该要用src和copy比较的,$.extend({"name1":"张三","age":"14"},{"name1":"李四","age":"14"}),这两个可以进行操作的。
  47. continue;
  48. }
  49.  
  50. // Recurse if we're merging plain objects or arrays
  51. // 如果是深拷贝,且被拷贝的属性值本身是个对象
  52. if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
  53. if ( copyIsArray ) { // 被拷贝的属性值是个数组
  54. copyIsArray = false;
  55. clone = src && jQuery.isArray(src) ? src : [];
  56.  
  57. } else { //被拷贝的属性值是个plainObject,比如{ nick: 'casper' }
  58. clone = src && jQuery.isPlainObject(src) ? src : {};
  59. }
  60.  
  61. // Never move original objects, clone them
  62. target[ name ] = jQuery.extend( deep, clone, copy ); // 递归~
  63.  
  64. // Don't bring in undefined values
  65. } else if ( copy !== undefined ) { // 浅拷贝,且属性值不为undefined
  66. target[ name ] = copy;
  67. }
  68. }
  69. }
  70. }
  71.  
  72. // Return the modified object
  73. return target;
  74.  
  75. {
  76. name1:"sdasd",
  77. "name2":{
  78. name1:"sdasd",
  79. "name2":{
  80. name1:"sdasd",
  81. "name2":{
  82. name1:"sdasd",
  83. "name2":{
  84. name1:"sdasd",
  85. "name2":{
  86. name1:"sdasd",
  87. "name2":{
  88. name1:"sdasd",
  89. "name2":{
  90. name1:"sdasd",
  91. "name2":
  92. }
  93. }
  94. }
  95. }
  96. }
  97. }
  98. }
  99. }

  

jquery extend源码解析的更多相关文章

  1. jQuery.extend源码深层分析

    在网站的开发中,经常会自己写一些jQuery插件来方便使用,其中自然少不了一个关键的方法->jQuery.extend(),使用这个方法来扩展jQuery对象. 那么今天就来讲讲这个函数的实现原 ...

  2. jquery 部分函数源码解析

    JSON.stringify源码(在看extend文档的时候看到) var object1 = { apple: 0, banana: {weight: 52, price: 100}, cherry ...

  3. jQuery.extend()源码解读

    // extend方法为jQuery对象和init对象的prototype扩展方法// 同时具有独立的扩展普通对象的功能jQuery.extend = jQuery.fn.extend = funct ...

  4. jQuery offset()源码解析

    首先是原型上的offset方法,根据arguments判断到底是取值还是设值.如果是设置,就遍历调用静态方法jQuery.offset.setOffset 如果是取值.那么就是从"var d ...

  5. jQuery 源码解析二:jQuery.fn.extend=jQuery.extend 方法探究

    终于动笔开始 jQuery 源码解析第二篇,写文章还真是有难度,要把自已懂的表述清楚,要让别人听懂真的不是一见易事. 在 jQuery 源码解析一:jQuery 类库整体架构设计解析 一文,大致描述了 ...

  6. 解析jQuery中extend方法--源码解析以及递归的过程《二》

    源码解析 在解析代码之前,首先要了解extend函数要解决什么问题,以及传入不同的参数,会达到怎样的效果.extend函数内部处理传入的不同参数,返回处理后的对象. extend函数用来扩展对象,增加 ...

  7. jquery的extend方法(源码解析)

    1.前段时间一直忙于研究数据可视化(d3.js,three.js) 以及 php的 laravel框架,生活上也遇到很多事情,这大概就是人生中的迷茫期吧. 回想起,刚出来工作的时候,目标很明确,要学习 ...

  8. jQuery整体架构源码解析(转载)

    jQuery整体架构源码解析 最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性, ...

  9. jquery 源码解析

    静态与实力方法共享设计 遍历方法 $(".a").each() //作为实例方法存在 $.each() //作为静态方法存在 Jquery源码 jQuery.prototype = ...

随机推荐

  1. Windows下IIS+PHP 5.2的安装与配置

    Windows下IIS+PHP 5.2的安装与配置   Windows下PHP的安装虽然简单,但如果不注意方法,仍然会让你头疼.此外,PHP 5.2版本与之前4.x版本也有一些不同,所以有必要记录一下 ...

  2. 怎么创建Porlet项目

    首先找到你liferay安装的地址D:\liferay\liferay-bundles-6.1.1\plugins-sdk,找到portlets这个文件夹点击(shift+鼠标右键)进入命令行窗口,写 ...

  3. Java设计原则—接口隔离原则(转)

    接口隔离原则 Interface Segregation Principle    定义: 客户端不应该依赖它不需要的接口 类间的依赖关系应该建立在最小的接口上 我们可以把这两个定义概括为一句话:建立 ...

  4. 前端神器ws激活步骤

    第一步:下载破解文件 也可以直接去我的github仓库中下载 第二步骤:操作bin目录的文件bin目录window下和mac下大致相同,故而不在单独说window a.将补丁复制到webstorm安装 ...

  5. hdu6206 Apple

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6206 题目: Apple Time Limit: 1000/1000 MS (Java/Oth ...

  6. cocos2d-x 2.x.x 新建工程 android下的 org文件夹丢失

    cocos2d-x 2.x.x 新建工程之后... 打开android项目..会发现src下没有org文件... 解决方法一: cocos2d-x-2.2.0\cocos2dx\platform\an ...

  7. IOS开发-数据库总结

    关于数据存储概念: 数据结构: 基本对象:NSDictionary.NSArray和NSSet这些对象. 复杂对象:关系模型.对象图和属性列表多种结构等. 存储方式: 内存:内存存储是临时的,运行时有 ...

  8. 解决NodeJS+Express模块的跨域访问控制问题:Access-Control-Allow-Origin

    在一个项目上想用NodeJS,在前端的js(http://localhost/xxx)中ajax访问后端RestAPI(http://localhost:3000/….)时(Chrome)报错: XM ...

  9. 在DLL编程中,导出函数为什么需要extern "C"

    转自:http://blog.csdn.net/zhongjling/article/details/8088664 一般来讲,在DLL编程过程中,对于导出的函数前 都需要加入 extern “C”, ...

  10. 20145211《网络渗透》msf辅助模块的应用

    20145211<网络渗透>msf辅助模块的应用 一.实验准备 启用VB的kali,需要用到桥接,VMware桥接总是罢工…… 二.实验步骤 最好开桥接模式,要不然你就多开几个虚拟机(只要 ...