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. 原”zencart建站仿站俱乐部”现升级为”zencart 学院“!

    特别告示: 原”zencart建站仿站俱乐部”现升级为”zencart 学院“!

  2. Oracle管道函数示例

    Oracle的管道函数需要定义下面的三样: Record/Object Type:定义一个Record或Object类型的变量,这个变量用于表示返回结果集的一行数据,有点像C#中的DataRow类. ...

  3. Android 上拉加载更多功能

    前几天看了github上面的例子,参照它的实现,自己又稍微改了一点,往项目里面增加了一个上拉加载更多功能.具体的实现如下: 首先要重写ListView: import android.content. ...

  4. libpq程序例子

    程序: [root@lex tst]# cat testlibpq.c /* * testlibpq.c * Test the C version of LIBPQ, the POSTGRES fro ...

  5. 【转】python中常用第三方包os sys

    1. os 这个模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.即它允许一个程序在编写后不需要任何改动,也不会发生任何问题,就可以在Linux和Windows下 ...

  6. 【10】令operator=返回一个reference to *this

    1.令operator= 返回一个reference to *this,为什么? 这只是一个协议,并无强制性.但是,为了与基本类型的行为保持一致性,强烈建议这么做.设计class 有一个宝典:一旦有疑 ...

  7. 【转】C++ function、bind以及lamda表达式

    本文是C++0x系列的第四篇,主要是内容是C++0x中新增的lambda表达式, function对象和bind机制.之所以把这三块放在一起讲,是因为这三块之间有着非常密切的关系,通过对比学习,加深对 ...

  8. [Webpack] Use the Webpack Dashboard to Monitor Webpack Operations

    Learn how to use the new Webpack Dashboard from Formidable Labs to display a pretty, useful output f ...

  9. hdu 1348 Wall(凸包模板题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1348 Wall Time Limit: 2000/1000 MS (Java/Others)    M ...

  10. linux高级命令组合

    ps -auxww | grep httpd 快速找到正在运行的apache服务安装目录 find / -path  'sina_app_v3*' 快速找到根目录下面的sina_app_v3目录 fi ...