jQuery 1.7.1 代码研究 extend

/* version : 1.7.1
* codeName : jQuery
* node author : Alfred lee
*/

// extend 函数是jQuery 的扩展函数。也是传说中的深度拷贝
//
首行把 jQuery.extend jQuery.fn.extend 统一赋值一个函数。
jQuery.extend = jQuery.fn.extend = function() {
var options, name, src, copy, copyIsArray, clone,
target = arguments[0] || {},
i = 1,
length = arguments.length,
deep = false;

/* options 要扩展到源的某个对象 称为选项
* name 索引名
* src 源的索引记录
* copy 选项的索引记录
* copyIsArray 是不是数组(用来判断如何给原来的对象扩展参见下面的详细分析)
* clone 复制体(源有的src的重新定义)
* target 源(被扩展的对象)
* i 记录数(用来记录从那里是要扩展到源的对象)
* length 参数长度
* deep 是否深度拷贝。即取值还是取址不知道和C的 * & 解释类似
*/

// Handle a deep copy situation
// 是深度的时候
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
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
if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
if ( copyIsArray ) {
//这里不知道为何重写了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 ) {
//不是深度就传址
target[ name ] = copy;
}
}
}
}

// Return the modified object
// 返回的就是扩充后的了。也就是经常用来做默认值的方法。
return target;
};

转载于:https://www.cnblogs.com/AlfredLee/archive/2012/02/01/jQuery_extend.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值