jQuery.extend()源码解读
// extend方法为jQuery对象和init对象的prototype扩展方法
// 同时具有独立的扩展普通对象的功能
jQuery.extend = jQuery.fn.extend = function() {
/*
*target被扩展的对象
*length参数的数量
*deep是否深度操作
*/
var options, name, src, copy, copyIsArray, clone,
target = arguments[0] || {},
i = 1,
length = arguments.length,
deep = false;
// target为第一个参数,如果第一个参数是Boolean类型的值,则把target赋值给deep
// deep表示是否进行深层面的复制,当为true时,进行深度复制,否则只进行第一层扩展
// 然后把第二个参数赋值给target
if ( typeof target === "boolean" ) {
deep = target;
target = arguments[1] || {};
// 将i赋值为2,跳过前两个参数
i = 2;
}
// target既不是对象也不是函数则把target设置为空对象。
if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
target = {};
}
// 如果只有一个参数,则把jQuery对象赋值给target,即扩展到jQuery对象上
if ( length === i ) {
target = this;
// i减1,指向被扩展对象
--i;
}
// 开始遍历需要被扩展到target上的参数
for ( ; i < length; i++ ) {
// 处理第i个被扩展的对象,即除去deep和target之外的对象
if ( (options = arguments[ i ]) != null ) {
// 遍历第i个对象的所有可遍历的属性
for ( name in options ) {
// 根据被扩展对象的键获得目标对象相应值,并赋值给src
src = target[ name ];
// 得到被扩展对象的值
copy = options[ name ];
// 这里为什么是比较target和copy?不应该是比较src和copy吗?
if ( target === copy ) {
continue;
}
// 当用户想要深度操作时,递归合并
// copy是纯对象或者是数组
if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
// 如果是数组
if ( copyIsArray ) {
// 将copyIsArray重新设置为false,为下次遍历做准备。
copyIsArray = false;
// 判断被扩展的对象中src是不是数组
clone = src && jQuery.isArray(src) ? src : [];
} else {
// 判断被扩展的对象中src是不是纯对象
clone = src && jQuery.isPlainObject(src) ? src : {};
}
// 递归调用extend方法,继续进行深度遍历
target[ name ] = jQuery.extend( deep, clone, copy );
// 如果不需要深度复制,则直接把copy(第i个被扩展对象中被遍历的那个键的值)
} else if ( copy !== undefined ) {
target[ name ] = copy;
}
}
}
}
// 原对象被改变,因此如果不想改变原对象,target可传入{}
return target;
};
jQuery.extend()源码解读的更多相关文章
- jQuery.Callbacks 源码解读二
一.参数标记 /* * once: 确保回调列表仅只fire一次 * unique: 在执行add操作中,确保回调列表中不存在重复的回调 * stopOnFalse: 当执行回调返回值为false,则 ...
- jQuery.extend源码深层分析
在网站的开发中,经常会自己写一些jQuery插件来方便使用,其中自然少不了一个关键的方法->jQuery.extend(),使用这个方法来扩展jQuery对象. 那么今天就来讲讲这个函数的实现原 ...
- jQuery toggleClass 源码解读
toggleClass: function( value, stateVal ) { var type = typeof value;//值类型 if ( typeof stateVal === &q ...
- jQuery attr() 源码解读
我们知道,$().attr()实质上是内部调用了jQuery.access方法,在调用时jQuery.attr作为回调传入.在通过种种判断(参看jQuery.access()方法)之后,取值和赋值最后 ...
- jquery extend源码解析
$.extend(obj1,0bj2,{"name":"s","age":22}) //target 要拷贝到哪个对象上 // i 要执行拷 ...
- jquery.fileupload源码解读笔记
基础编程风格 新建 test.html 和 test.js和 main.js和 无论哪种顺序 <body> <script src="/Sandeep/js/jquery ...
- jQuery框架源码解读
1.jQuery 1.9.1 parseJSON: function( data ) { // Attempt to parse using the native JSON parser first ...
- jQuery position() 源码解读
position的代码比较简单... position: function() { if ( !this[ 0 ] ) { return; } var offsetParent, offset, el ...
- jquery offsetParent()源码解读
offsetParent: function() { return this.map(function() { var offsetParent = this.offsetParent || docE ...
随机推荐
- 64位操作系统下用Microsoft.Jet.OLEDB.4.0出现未注册错误
在WIN7 64位下用Microsoft.Jet.OLEDB.4.0方法访问数据库Access,出现未注册错误 如果是要建立64位的应用程序 1.Microsoft Access Database E ...
- PHP于DIRECTORY_SEPARATOR任务
DIRECTORY_SEPARATOR是php的内部常量.用于显示系统分隔符的命令,不须要不论什么定义与包括就可以直接使用. 在windows下路径分隔符是\(当然/在部分系统上也是能够正常执行的), ...
- jquery之ajax中国乱码的解决方案
$.ajax({ dataType : 'json',type : 'POST',url : 'http://localhost/test/test.do',data : {id: 1, type: ...
- C和指针 (pointers on C)——第十一章:动态内存分配(下)习题
1.编写calloc,内部用malloc. void *calloc (size_t n, size_t size) { char * memory; memory =(char*) malloc(n ...
- 一天JavaScript示例-判定web页面的区域
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- lua 怎样输出树状结构的table?
为了让游戏前端数据输出更加条理,做了一个简单树状结构来打印数据. ccmlog.lua local function __tostring(value, indent, vmap) local str ...
- cocos2dx 使得单麻将(三)
cocos2dx 使得单麻将(三) 麻将逻辑4.得到手牌数据 我们已经保存了一个一维数组, 类似于一个表格,统计出全部牌相应的数量, 但我们如何得到当前手中是什么牌呢 //扑克转换 BYTE Swit ...
- Java 新特性(2) - JDK6 新特性
http://freesea.iteye.com/blog/160133 JDK6的新特性之一_Desktop类和SystemTray类 JDK6的新特性之二_使用JAXB2来实现对象与XML之间的映 ...
- Android数据加载和Json解析——蓝本
1.下载数据来创建一个实体类 class MyData { String imagepath; String title; String desc; public MyData(String imag ...
- 他们控制的定义(2.3):SurfaceView和SurfaceHolder
这个例子需求和流程: Activity加载它们的定义SurfaceView-> SurfaceView 构造函数:初始化刷.传感器.SurfaceHolder和注册SurfaceHolder的监 ...