源码291~353行,jQuery.extend函数(utils)
jQuery.extend()使用方式有三种:
1.jQuery.extend({...}),参数为一个对象,这种使用方式是把参数的值cp给jQuery对象,这是扩展jQuery最常用的方式,后面很多代码都采用这种方式。
2.jQuery.extend({...},{...}...),参数为多个对象,这种方式是把后面的多个对象的值cp给第一个对象,如果后面对象有和前面对象相同的属性,则后面的覆盖前面的。
3.jQuery.extend(true,{a:{h:22,w:333}},{a:{h:552,s:2532},c:287}),深度cp,递归合并、覆盖、复制的方式。返回结果为{a:{h:552,w:333,s:2532},c:287}
接下来看源码:
jQuery.extend = jQuery.fn.extend = function() {
var options, name, src, copy, copyIsArray, clone,
target = arguments[0] || {},//参数目标对象
i = 1,
length = arguments.length,//参数长度
deep = false;//是否为深度复制
// Handle a deep copy situation
//如果为深度复制,则目标对象和原对象游标值i,以及深度值都进行更新
if ( typeof target === "boolean" ) {
deep = target;
target = arguments[1] || {};
// skip the boolean and the target
i = 2;
}
// Handle case when target is a string or something (possible in deep copy)
//当目标对象的值类型错误,则重置为{}
if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
target = {};
}
// extend jQuery itself if only one argument is passed
//当参数值长度为1的情况下,目标对象就为jQuery自身
if ( length === i ) {
target = this;
--i;
}
for ( ; i < length; i++ ) {
// Only deal with non-null/undefined values
if ( (options = arguments[ i ]) != null ) {//忽略空对象
// Extend the base object
for ( name in options ) {
src = target[ name ];
copy = options[ name ];//存储对象的值
// Prevent never-ending loop
if ( target === copy ) {
continue;
}
// Recurse if we're merging plain objects or arrays
//深度复制只有属性深度多于俩层的对象关系的结构的,如{a:{s:21,age:11}}或{a:['s'=>21,'age'=>11]}
if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
if ( copyIsArray ) {//如果是数组对象
copyIsArray = false;
clone = src && jQuery.isArray(src) ? src : [];
} else {//普通对象
clone = src && jQuery.isPlainObject(src) ? src : {};
}
// Never move original objects, clone them
// 调用自身进行递归复制
target[ name ] = jQuery.extend( deep, clone, copy );
// Don't bring in undefined values
} else if ( copy !== undefined ) {//非深度CP直接覆盖目标属性
target[ name ] = copy;
}
}
}
}
// Return the modified object
return target;
};
分享到:
相关推荐
NULL 博文链接:https://bijian1013.iteye.com/blog/2255035
jquery源码分析(2.0.3版本) 大概内容大纲 (功能(){ (21,94)定义了一些变量和函数jQuery = function(){} (96,284)给JQ对象添加一些方法和属性 (285,347)扩展名:JQ的继承方法 (349,817)jQuery....
1. 源码分析jQuery.extend = jQuery.fn.extend = function() {var options, name, src, co
NULL 博文链接:https://gghaomm.iteye.com/blog/1746699
jQuery源码分析系列的目录请查看 http://nuysoft.iteye.com/blog/1177451,想系统的好好写写,目前还是从我感兴趣的部分开始,如果大家有对哪个模块感兴趣的,建议优先分析的,可以告诉我,一起学习。 3.4 其他静态...
本文实例讲述了JQuery中extend的用法。分享给大家供大家参考。...一、jQuery.extend函数的源码 jQuery.extend = jQuery.fn.extend = function() { var options, name, src, copy, copyIsArray, clone, target = a
NULL 博文链接:https://bijian1013.iteye.com/blog/2255037
* jQuery源码分析-each函数 * jQuery版本:1.4.2 * * ---------------------------------------------------------- * 函数介绍 * * each函数通过jQuery.extend函数附加到jQuery对象中: * jQuery.extend({ * each: ...
上一篇记录了BaiduTemplate模板引擎使用示例(附源码),在此基础上对使用方法进行了封装 自定义插件jajaxrefresh.js 代码如下: //闭包限定命名空间 ... //使用jQuery.extend 覆盖插件默认参数 var $this = $(t
本文较为详细的分析了jQuery源码解读之addClass()方法。分享给大家供大家参考。具体分析如下: 给jQuery原型对象扩展addClass功能,jQuery.fn就是jQuery.prototype 代码如下:jQuery.fn.extend({ /* 可以看出这是一...
本文实例讲述了jQuery源码解读之extend()与工具方法、实例方法。分享给大家供大家参考,具体如下: 使用jQuery的时候会发现,jQuery中有的函数是这样使用的: $.get(); $.post(); $.getJSON(); 有些函数是这样使用...
jquery源码分析,extend编写示范,SNS研发团队内部分享资料
我在源码里给出了注释,有什么不足之处后或者可以改进的地方, 希望能够大家留言探讨… 效果图(比较朴素): 代码如下: ;(function($) { $.fn.roller = function(options) { var opts = $.extend({}, $.fn.roller....
本文较为详细的分析了jQuery源码解读之removeAttr()方法。分享给大家供大家参考。具体分析如下: 扩展jQuery原型对象的方法: 代码如下:jQuery.fn.extend({ //name,传入要DOM元素要移除的属性名。 removeAttr: ...
不依赖jQuery和underscore,只有10k,小巧实用。Bone.EventsBone.ClassBone.ViewBone.RouterBone.History范例代码:1.为object添加事件功能var obj = Bone.extend({}, Bone.Events, {...});2.创建类var cls = Bone....
本文较为详细的分析了jQuery源码解读之removeClass()方法。分享给大家供大家参考。具体分析如下: removeClass()方法和addClass()差别不大。这就来看看: 代码如下:jQuery.fn.extend({ removeClass: function( ...
主要介绍了通过jQuery.extend的源码分析了一下JQuery中的extend方法实现原理以及使用方式,非常的详细,这里推荐给大家,有需要的小伙伴来参考下吧。
顺一遍jQuery源码的大体逻辑: 一些变量和函数jQuery继承即扩展方法jQuery.extend方法,即jQuery的静态方法,也可以说是一些工具方法Sizzle选择器,是对复杂选择器的处理,可以单独拿出来用某个对象$ .Callbacks延迟...