jQuery 源码分析4: jQuery.extend

jQuery.extend是jQuery最重要的方法之一,下面看看jQuery是怎样实现扩展操作的

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

通过jQuery.extend方法可以为jQuery或其他对象进行属性扩展操作。对于纯对象可选择执行深拷贝,对于数组是一定执行深拷贝。

jQuery的大部分功能都通过此方法进行扩展,也可以此为jQuery扩展插件。

jQuery.extend({}),此时target为 jQuery.prototype,为jQuery扩展静态属性或方法,jQuery内部也是以此方法进行。

jQuery().extend({}),此时target为jQuery对象本身,给jQuery对象扩展属性或方法。

时间: 2024-11-15 19:57:57

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

jQuery源码分析之=&gt;jQuery的定义

最近写前段的代码比较多,jQuery是用的最多的一个对象,但是之前几次看了源码,都没搞清楚jQuery是怎么定义的,今天终于看明白怎么回事了.记录下来,算是一个新的开始吧. (文中源码都是jQuery-1.10.2版本的) 先上一段jQuery定义的源码,定义了jQuery为一个function 1 // Define a local copy of jQuery 2 jQuery = function( selector, context ) { 3 // The jQuery object

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

1 // 建立方法实例,提高方法访问的速度(避免在原型链上搜索) 2 3 var deletedIds = []; 4 var slice = deletedIds.slice; 5 var concat = deletedIds.concat; 6 var push = deletedIds.push; 7 var indexOf = deletedIds.indexOf; 8 var class2type = {}; 9 var toString = class2type.toString;

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

97 jQuery.fn = jQuery.prototype = { 98 constructor: jQuery, 99 init: function( selector, context, rootjQuery ) { }, 210 selector: "", 213 jquery: "1.7.2", 216 length: 0, 219 size: function() {}, 223 toArray: function() {}, 229 get: fun

妙味课堂jquery源码分析视频教程 jquery源码逐行分析分析

视频教程一共58课有10+G,解析的jquery版本未2.0版[娘的,我现在都还在用1.8,他们13年就已经在用2.0了!看来我是落后了!].本视频学习的好处不比那些实战的差!具体自己去感悟! 下载地址:百度网盘下载 原文地址:https://www.cnblogs.com/lomeixiok/p/11355306.html

jquery源码分析(二)——结构

再来复习下整体架构: jQuery源码分析(基于 jQuery 1.11 版本,共计8829行源码) (21,94)                定义了一些变量和函数jQuery=function(){} (96,280)        给jQuery添加一些方法和属性,jQuery.fn=jQuery.prototype(285,347)        extend:        jQuery的一些继承方法        更容易进行后续的扩展                       

jQuery源码分析系列(33) : AJAX中的前置过滤器和请求分发器

jQuery1.5以后,AJAX模块提供了三个新的方法用于管理.扩展AJAX请求,分别是: 1.前置过滤器 jQuery. ajaxPrefilter 2.请求分发器 jQuery. ajaxTransport, 3.类型转换器 ajaxConvert 源码结构: jQuery.extend({ /** * 前置过滤器 * @type {[type]} */ ajaxPrefilter: addToPrefiltersOrTransports(prefilters), /** * 请求分发器 *

Jquery源码分析

1.概述 jQuery是一个非常优秀的Js库,与prototype,YUI,Mootools等众多的Js类库相比,它剑走偏锋,从web开发最实用的角度出发,抛除了一些中看但不实用的东西,为开发者提供一个短小精悍的类库.由于其个短小精悍,使用简单方便,性能相对高效.众多的开发者都选择Jquery来进行辅助的web开发. 在使用jquery时开发,我们也会时常碰到许多的问题,但是jquery的代码很晦涩,难起看懂,当开发时出现了问题,看不懂源码,不知道如何去排错. John Resig,Jquery

jQuery源码分析-each函数

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

jQuery源码分析系列(39) : 动画队列

data函数在jQuery中只有短短的300行代码,非常不起点 ,剖析源码的时候你会发现jQuery只要在有需要保存数据的地方无时无刻不依赖这个基础设施 动画会调用队列,队列会调用data数据接口还保存队列里面的的动画数据 所以我们在自习回顾下关于数据缓存 //These may be used throughout the jQuery core codebase //存数据的 //用户使用 data_user = new Data(); //存储对象 //jQuery内部私有 //用来存事件