extend方法为jQuery对象的核心之一,语法如下:

jQuery.extend([deep], target, object1, [objectN]),返回值Object。

概述:用一个或多个其它对象来扩展一个对象,返回被扩展的对象。

如果不指定target,则给Jquery命名空间本身进行扩展。这有助于插件作者为Jquery增加新方法。

如果第一个参数设置为true,则Jquery返回一个深层次的副本,递归地复制找到的任何对象。否则的话,副本会与原对象共享结构。未定义的属性将不会被复制,然而从对象的原型继承的属性将会被复制。

参数:target,[object1],[objectN]      Object,Object,Object

target:一个对象,如果附加的对象被传递给这个方法将那么它将接收新的属性,如果它是唯一的参数将扩展jQuery的命名空间。

object1:待合并到第一个对象的对象。

objectN:待合并到第一个对象的对象。

[deep],target,object1,[objectN]        Object,Object,Object,Object

deep:如果设为true,则递归合并。

target:待修改对象。

object1:待合并到第一个对象的对象。

objectN:待合并到第一个对象的对象。

示例:

var ts = function () {this.age = 23;}
console.log($.extend([1,2,3],[4,5,6,7]));
// 结果:[4,5,6,7]
console.log($.extend(false, new ts(), { age: 12, name: "lisi" }));
//结果: Object {age: 12, name: "lisi"}
console.log($.extend({ age: 43, name: "张三" }, { sex: "男", height: 180 }, { job: "警察" }));
//结果:Object {age: 43, name: "张三", sex: "男", height: 180, job: "警察"}
console.log($.extend(true, { age: 23, child: { age: 1, sex: "男" } }, { name: '张三', child: { name: "李四" } }));
//结果:Object {age: 23, child: {age:1,name:'李四',sex:'男'}, name: "张三"}
console.log($.extend(false, { age: 23, child: { age: 1, sex: "男" } }, { name: '张三', child: { name: "李四" } }));
//结果:Object {age: 23, child: {name:"李四"}, name: "张三"}
console.log($.extend(true))
//结果: Object {}

在看源码之前我们先了解下深拷贝和浅拷贝:

浅拷贝 :仅仅复制对象的引用,而不是对象本身;

深拷贝:把复制的对象所引用的全部对象都复制一遍。

浅拷贝例子:

/* ================ 浅拷贝 ================ */
function simpleClone(initalObj) {
var obj = {};
for ( var i in initalObj) {
obj[i] = initalObj[i];
}
return obj;
}

深拷贝例子:

/* ================ 深拷贝 ================ */
function deepClone(initalObj, finalObj) {
var obj = finalObj || {};
for (var i in initalObj) {
if (typeof initalObj[i] === 'object') {
obj[i] = (initalObj[i].constructor === Array) ? [] : {};
arguments.callee(initalObj[i], obj[i]);
} else {
obj[i] = initalObj[i];
}
}
return obj;
}

有了深拷贝和浅拷贝的介绍,我们再来看 Jquery.extend的源码分析:     

jQuery.extend = jQuery.fn.extend = function() {
var src, copyIsArray, copy, name,
options, //20170614 huanhua 需要被合并的对象的临时变量
clone,
target = arguments[0] || {}, //huanhua 20170614 第一个参数赋值给 target ,需要合并到的对象 target
i = 1, //huanhua 20170614 被合并的对象,在参数中的起始位置,默认是第二个参数,索引下标就是1
length = arguments.length,
deep = false; //huanhua 20170614 深浅拷贝,默认是浅拷贝 // Handle a deep copy situation
  // 20170614 huanhua 处理类似 jquery.extend(true,{age:23,child:{age:1,sex:"男"}},{name:'张三',child:{name:"李四"}})这种扩展 if ( typeof target === "boolean" ) {
deep = target; //huanhua 20170614 设置是深拷贝还是浅拷贝
target = arguments[1] || {}; //huanhua 20170614 此时需要合并到的对象是第二个参数
// skip the boolean and the target
i = 2; //20170614 huanhua 在进行深浅拷贝时,需要被合并的对象的起始位置是第3个参数,索引下标就是2开始
} // Handle case when target is a string or something (possible in deep copy)
// 20170614 huanhua 处理类似 $.extend("hshshdhd", [4, 5, 6, 7]) 结果:Object {0: 4, 1: 5, 2: 6, 3: 7}这种的扩展
if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
target = {}; //20170614 huanhua 被扩展的对象,扩展到一个对象上
} // extend jQuery itself if only one argument is passed
// 20170614 huanhau 处理类似 $.extend({name:"张哈"}) 这种,只有一个参数,并且还不是 $.extend(true)这种的参数格式
//此时参数的长度是1,i也是1
if ( length === i ) {
target = this;//20170614 huanhua 需要扩展到的对象就是jquery自己
--i; //20170614 huanhua 需要被合并的对象起始位置就是第一个参数,所以索引下标就是从 (--i)0开始
}
//20170614 huanhua 从需要被合并的对象的起始位置开始循环处理合并
for ( ; i < length; i++ ) {
// Only deal with non-null/undefined values
//20170614 huanhua 把需要被合并的对象赋值给 options ,并且只处理 非 null,非 undefined 的对象
if ( (options = arguments[ i ]) != null ) {
// Extend the base object
//20170614 huanhua 开始合并对象
for ( name in options ) {
//20170614 huanhua 在需要被扩展到的对象中寻找需要扩展的对象属性,并赋值给 src
src = target[ name ];
//20170614 huanhua 把需要被扩展的对象属性赋值给copy
copy = options[ name ]; // Prevent never-ending loop
//20170614 huanhua var o={w:2} $.extend(o,{hao:o}),结果 Object {w:2} 处理这种扩展,在递归深拷贝的时候以防死循环
//20170614 huanhua 譬如:
// var o = { n: o };
// var xh = 0;
// var f = function (o) {
// for (var m in o) {
// console.log((xh++));
// console.log(m);
// f(m);
// }
// }
// f(o);
// 在递归运行的时候,就是一个死循环
if ( target === copy ) {
continue;
} // Recurse if we're merging plain objects or arrays
//20170614 huanhua 需要深拷贝deep,并且需要拷贝的属性copy是有效的(非null,非undefined),
//并且需要拷贝copy的属性是纯粹的对象({a:1}或者new object())或者数组
if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
//20170614 huanhua 拷贝的是数组
if ( copyIsArray ) {
copyIsArray = false;
//20170614 huanhua如果需要扩展到的对象中不存在属性src = target[ name ],或者不是数组格式的,
//就重新用生成一个空的数组 [] 来装载扩展的数据,否则就用原来的属性来装载数据
clone = src && jQuery.isArray(src) ? src : []; } else {
//20170614 huanhua如果需要扩展到的对象中不存在属性src = target[ name ],或者不是纯粹对象格式的,
//就重新用生成一个空的对象 {} 来装载扩展的数据,否则就用原来的属性来装载数据
clone = src && jQuery.isPlainObject(src) ? src : {};
} // Never move original objects, clone them
//20170614 huanhua 递归扩展属性对象中的每一个属性
target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values
//20170614 huanhua 其它的合并就浅拷贝,直接赋值或者添加属性
} else if ( copy !== undefined ) {
target[ name ] = copy;
}
}
}
} // Return the modified object 20170614 huanhua 返回合并后的对象
return target;
};

javascript的继承有三种方式

1:原型继承。

2:类式继承。

3:拷贝继承。

Juqery采用的就是拷贝继承。

这只是个人的理解,有不对之处,望各位大神们指正。

jQuery.extend 与 jQuery.fn.extend的更多相关文章

  1. jquery中方法扩展 ($.fn & $.extend) 学习笔记

    A.$.fn 1.$.fn.method() 函数为jQuery对象扩展一个属性和方法(主要用于扩展方法) :method 为自定义方法名 ($.fn 等效 $.prototype) $.fn.bor ...

  2. $.extend(object) 和 $.fn.extend(object)

    1.jQuery.extend(object); 它是为jQuery类添加类方法,可以理解为添加静态方法.如: jQuery.extend({ min: function(a, b) { return ...

  3. jQuery.fn.extend() 与 jQuery.extend()

    jQuery.fn如何扩展. jQuery插件 $.fn(object)与$.extend(object) jQuery提供了两个方法帮助开发插件 $.extend(object);扩展jQuery类 ...

  4. jQuery中,$.extend,$obj.extend和$.fn.extend三者的区别

    jQuery中,$.extend,$obj.extend和$.fn.extend三者的区别 现在做的一个项目,所使用的框架是基于jQuery扩展的,于是平时学了一下jQuery,了解到了它的扩展函数: ...

  5. jQuery 第九章 工具方法之插件扩展 $.extend() 和 $.fn.extend()

    $.extend() $.fn.extend() -------------------------------------------------- $.extend() 插件扩展(工具方法) jq ...

  6. WHAT?【 $.fn.extend() 】vs【 $.extend() 】

    废话不多说,干货来了,转自http://www.cnblogs.com/hellman/p/4349777.html (function($){ $.fn.extend({ test:function ...

  7. $.fn.extend 和$.extend函数

    区别和详解:jQuery extend()和jQuery.fn.extend()     首先是简单的概述区别:$.extend()是类方法   $.fn.extend()是原型方法   对象方法和原 ...

  8. jquery.fn.extend与jquery.extend--(初体验二)

    1.jquery.extend(object); 为扩展jQuery类本身.为类添加新的方法. jquery.fn.extend(object);给jQuery对象添加方法. $.extend({ a ...

  9. jQuery为开发插件提拱了两个方法:jQuery.fn.extend(); jQuery.extend();

    jQuery为开发插件提拱了两个方法,分别是: jQuery.fn.extend(); jQuery.extend(); jQuery.fn jQuery.fn = jQuery.prototype ...

  10. Jquery揭秘系列:实现$.fn.extend 和$.extend函数

    前面我们扩展了bind方法和ready函数,这次我要讲一下$.fn.extend 和$.extend函数. 其他的不多说,直接切入主题吧! 先来看看这两个函数的区别: $.fn.extend是为查询的 ...

随机推荐

  1. python第三方模块的导入

    模块搜索路径 当我们尝试加载一个模块时,Python会在指定的路径下搜索对应的.py文件,如果找不到,就会报错: >>> import module1 Traceback (most ...

  2. ubuntu deb pacakge 开发

    安装构建工具 apt-get install pbuilder 推荐安装 sudo apt-get install build-essential autoconf automake \ autoto ...

  3. Scala环境(集成idea)

    1 语言介绍 他已经出生15年了,就像明星一样,谁都不可能一开始就人气爆棚粉丝无数,得慢慢混. 据说这家伙已经威胁到了Java的地位,我当时也是被这句话惊到,才毅然决然的认识了他.目前也正在努力学习中 ...

  4. 1.1.18 Word里将“字体加红”自定义为快捷方式

    1.单击[文件]>[选项]: 2.选择[自定义功能区],单击[键盘快捷方式]旁的[自定义]: 3.在[类别]菜单中选择[开始选项卡]:在[命令]菜单中选择[FontColorPicker] (或 ...

  5. maya中的顶点平滑算法(vertex smooth algorithm)

    继上文继续写.有了顶点迭代器之后就可以利用MItMeshVertex类的getConnectedVertices方法来获取相连点并代入平滑算法. 选择什么样的平滑算法呢?本人比较懒,直接打开了计算机图 ...

  6. 12月中旬项目中出现的几个bug解决方法的思考

    这周做的项目遇到2个费了很多时间才解决的bug,解决之后,发现根本问题并不是什么很难的技术难点,都是因为自己在写代码的过程中,思维不够清晰.还有一个需要再提高的地方就是解决问题的思维,如何快速定位到问 ...

  7. Win7系统安装Centos7.0双系统(一)

    项目环境测试,过去在虚拟机安装只要配置好镜像很快就可以轻松安装,但是在真实机中安装就有些略坑.网上有很多说法是把iso文件中安装引导拷出来,试了很久还是觉得U盘镜像直接安装更便捷.靠谱.因为CentO ...

  8. 关于分布式uuid的一点设想

    在一次公开课上,听别人讲过全局分布式uuid的设计,听过twitter的snowflake的设计.也听过,如果使用单独的计数器服务,不可能每次都保存当前计数器到文本,自己想到应该可以每隔一些数,例如1 ...

  9. Python Pycharm 专题

    http://www.themesmap.com/theme.html?t=time&page=3 一些好的主题地址 直接导入import settings就可以使用了

  10. 解决mysql使用GTID主从复制错误问题

    做MySQL主从的话肯定会遇到很多同步上的问题,大多数都是由于机器宕机,重启,或者是主键冲突等引起的从服务器停止工作,这里专门收集类似问题并提供整理解决方案,仅供参考. 1.主从网络中断,或主服务器重 ...