JQuery extend拓展方法解析

**

JQuery extend方法解析

**

该方法在于jQuery插件源码 226 – 294行,该方法也就是我们所说的深浅拷贝~

首先它声明10个参数分别是

options,//原对象
name, //原对象属性名
src, //目标对象属性名
copy,//拷贝的原对象值
copyIsArray,//如果拷贝的原对象值是数组
clone,//克隆目标对象值
i,//target起始下标
target,//目标对象
length,//参数数量
deep;//是否深度拷贝,jQuery默认浅拷贝

第一个参数为合并地址,第二参数为合并对象,第三个参数为是深浅拷贝boolean类型
JQuery extend拓展方法解析

这一段代码判断第一个参数如果为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))
JQuery extend拓展方法解析

下图代码判断参数数量如果为1,则拓展自身属性或方法(this指向jQuery原型)
i=0;
JQuery extend拓展方法解析
以下这种情况(注意:$.function$.fn.function 指向位置不同,如需详解请查看jQuery源码)

$.extend({name1:function () {/....},name2:function () {/....}});
$.name1(/...);
$.fn.extend({name1:function () {/....},name2:function () {/....}});
$(/...).name1(/...);

JQuery extend拓展方法解析
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;
JQuery extend拓展方法解析

284行,不是对象或数组,那肯定是可以直接拷贝,但是不能拷贝undefined

最后把拷贝好的对象或者说合并的对象返回.