深拷贝会将对象内部的对象一一做复制操纵,是以深拷贝的操纵应当须要递归算法,这里我要再介绍一个函数:arguments.callee。callee 属性是 arguments 对象的一个成员,他默示对函数对象本身的引用,这有利于匿名函数的递归或确保函数的封装性,关于arguments.callee的应用,大师看下面的代码:
whatType =大师看到了arguments.callee的类型是Function,而内容就是calleeDemo()。
好了,打通了技巧难点我们来看看深拷贝的代码应当如何书写了,代码如下:
num:1toStr =(copy =;(xQuery.is(copy,""Object""(xQuery.is(copy,""Array""=dcopyobj =
console.log(""dcopyobj.obj.content:"" + dcopyobj.obj.content);
dcopyobj.arrs[1].Array02 = ""Deep I am changed""
既然我们本身写出来了javascript的深拷贝和浅拷贝,那么我们再去研究jQuery里的深浅拷贝操纵必然会事半功倍的。
1.3 ¥.extend用法胪陈
下面我借用jQuery手册里的实例代码来讲解¥.extend的用法。
(1) 测试01:参数个数为2,并且参数类型都是object,代码如下:
有上方的成果我们似乎感觉extend默认是浅拷贝,默认下extend的复制到底是浅拷贝还是深拷贝,这个须要一个应用deep标识表记标帜和不应用deep标识表记标帜的斗劲过程,后面我将做如许的测试。下面看我第一个测试实例。
(2) 测试02:多参数,这里我应用4个参数,参数类型都是object:
empty =console.log(secsets);
console.log(secopts);
console.log(""==================测试02 end"");
(3) 测试03 :浅拷贝测试,参数为3,第一个是是否深浅拷贝的标识表记标帜,后面两个是对象,代码如下:
shallowsets = {""validate"":console.log(shallowsets);
shallowsets = {""validate"":= ""ok""
console.log(shallowsets);
console.log(deepsets);
deepsets = {""validate"":= ""okdeep""
console.log(deepsets);
console.log(""==================测试03 end"");
上方的成果让我困惑了,当我把deep参数设置为false时辰,extend的返回值和target的值不一致,extend办法的返回值是终极拷贝的成果,而target还是本来的值,并且我去更改返回成果的值时辰,target没有被影响。当deep参数为true的成果和我们不设定deep的成果一样,那么我们可以这么懂得了,默认下extend履行的是深拷贝操纵,然则这个结论我还不想过早给出,后面我会解析extend办法的源码,研究完了源码我再给出本身的结论。
以上的例子都是用对象做参数,数组的成果和对象一样,所以这里不再写关于数组的测试代码,下面我会应用字符串以及数字类型做测试,看看extend返回的成果是咋样的。
(4) 测试04:参数个数为2,参数类型都是字符串
代码如下:
strsets = ""strsets"",stropts = ""opts""console.log(strsets);
strsets = ""strsets"",stropts = ""opts""
console.log(strsets);
strobj = xj.extend(
console.log(strsets);
console.log(""==================测试04 end"");
拷贝的都是字符串,应用extend真的没啥意义了,这个反过来也申明extend办法只是针对引用类型的数据做拷贝操纵。
(5) 测试05:参数个数为2,target是字符串,第二个是object类型,
代码如下:
targetstr = ""sharpxiajun""console.log(targetstr);,targetstr,desobj08));
targetstr = ""sharpxiajun""
console.log(targetstr);= ¥.fn.xjcopy = = arguments[0] ||
i = 2
( ; i < length; i++
( name
= = src && ¥.isPlainObject(src) ?
target[ name ] =( copy !==
return target; };
})(jQuery)
测试页面xjqcopy.html代码如下:
大师可以看到应用我新封装的插件,和extend办法履行的成果一模一样。
下一篇我将解析extend源代码。