JQuery extend拓展方法解析
**
JQuery extend方法解析
**
该方法在于jQuery插件源码 226 – 294行,该方法也就是我们所说的深浅拷贝~
首先它声明10个参数分别是
options,//原对象
name, //原对象属性名
src, //目标对象属性名
copy,//拷贝的原对象值
copyIsArray,//如果拷贝的原对象值是数组
clone,//克隆目标对象值
i,//target起始下标
target,//目标对象
length,//参数数量
deep;//是否深度拷贝,jQuery默认浅拷贝
第一个参数为合并地址,第二参数为合并对象,第三个参数为是深浅拷贝boolean类型
这一段代码判断第一个参数如果为boolean
类型 (true|false
),那就把target
的值付给deep
变量,把参数2的值给target
变量的值,i=2
,第三参数,以下情况
var boj1 ={a:2};
var boj2 ={B:1};
$.extend(true,boj1,boj2);
下图这段代码判断如果不为对象或方法,那么target等于一个空object {}
(isFunction()
这个方法在jQuery源码73行左右,主要判断是否为函数或数字(function || number
))
下图代码判断参数数量如果为1,则拓展自身属性或方法(this
指向jQuery原型)i=0
;
以下这种情况(注意:$.function
和 $.fn.function
指向位置不同,如需详解请查看jQuery源码)
$.extend({name1:function () {/....},name2:function () {/....}});
$.name1(/...);
$.fn.extend({name1:function () {/....},name2:function () {/....}});
$(/...).name1(/...);
for
循环如果i<length,i=2,length=3
,从某种意义上讲他们是相等的
257行,只拷贝不等于null的
259行,当原对象满足条件是开始拷贝
261 - 262行,把原对象和目标对象属性值赋值到相应变量
264 - 266行,当目标对象和原对象某个值相同时,跳出本次循环防止死循环(本人暂未搞清楚如何让调用时target = copy
注意:并不是结束循环)因为有以下代码防止特殊情况,本人感觉判断target == copy
是多余的,但是John Resig肯定有他的道理
if ( typeof target !== "object" && !isFunction( target ) ) {
target = {};
}
269行,判断是否深度拷贝并且原对象是否不为unll,false,undefined
,并且是数组或者对象
272 - 278行,如果是数组则创建一个空数组否则创建空对象,如下代码,boj2
,b的值为对象{...}
,则创建{}
,否则b的值为数组[…]
var boj1 ={B:1,a:1};
var boj2 ={B:1,a:1,b:{e:3}};
$.extend(true,boj1,boj2)
281行,本人觉得写得很Nice,递归,把clone
、当做目标对象,copy
当做原对象,简单画了个图…,当拷贝完成时 出口就是 return target;
284行,不是对象或数组,那肯定是可以直接拷贝,但是不能拷贝undefined
最后把拷贝好的对象或者说合并的对象返回.