【jQuery中extend用法】
extend是延伸的意思,平时我们写项目经?;嵊龅揭桓龇椒ㄖ赜玫氖焙?,但是呢,jq自带的又没有这个方法,满足不了我们,那怎么办呢,
咦,那我就会告诉你,我们可以自己来给jq中增加一些方法,那么怎么增加呢?下面我就介绍一下这个方法!
比如现在我需要一个方法,可以把一个元素背景颜色变色,看例子:
$(function(){
$('#div1').toRed(); //让当前这个元素变红色
$('#div2').toBlue(); //让当前这个元素变蓝色
$('div').toRandomColor(); //试试能不能延伸循环来让所有的都变色
})
那么怎么写这个toRed,toBlue方法呢?
$.fn.toRed=function(){
this.css('background','red')
};
$.fn.toBlue=function(){
this.css('background','blue')
};
试试能不能延伸循环来让所有的都变色toRandomColor
到底能不能呢?答案是:可以
给jq延伸一些小方法,也可以直接用jq的功能,比如说循环$.each:
$.fn.toRandomColor=function(){
$.each($(this),function(index,element){ //直接用jq的循环即可,
$(element).css('background','red')
})
};
那么有的同学说了,鹏哥,这里面没有用到extend啊。。那现在我告诉你怎么用:
$.fn.extend({ //直接在extend(里面写一个json,然后直接写方法名,以及方法即可)
toBlue:function(){
this.css('background','blue')
},
toRed:function(){
this.css('background','red')
}
});
以上只是介绍一下extend的用法,下面开始进入今天的正题,用extend方法来深度克隆一个对象。
那么怎么用extend克隆呢,首先介绍一下extend:
**extend(true/false,dest,src1,src2,src3...) **
第一个参数为true或者是false,true就是深度克隆,false就是浅克隆。
浅拷贝(false 默认):如果第二个参数对象有的属性第一个参数对象也有,那么不会进行相同参数内部的比较,直接将第一个对象的相同参数覆盖。
深拷贝(true):如果第二个参数对象有的属性第一个参数对象也有,还要继续在这个相同的参数向下一层找,比较相同参数的对象中是否还有不一样的属性,如果有,将其继承到第一个对象,如果没有,则覆盖。
那么怎么直接克隆一个对象呢。
比如说,我有这么一个对象,要求给我深度克隆出一个对象,(前面的文章中我也说过浅克隆和深克隆的原生写法)
var obj1 = {
'a': 's1',
'b': [1,2,3,{'a':'s2'}],
'c': {'a':'s3', 'b': [4,5,6]}
};
var obj2=$.extend(true,{},obj1); //第二个参数是指定我要复制后的那个对象是什么写数组就是数组,写json就是json
obj1.a="adsa";
obj2.b[0]=12;
console.log(obj1); //{'adsa': 's1','b': [1,2,3,{'a':'s2'}],'c': {'a':'s3', 'b': [4,5,6]}}
console.log(obj2); //{'adsa': 's1','b': [12,2,3,{'a':'s2'}],'c': {'a':'s3', 'b': [4,5,6]}}
或者是这样用合并两个对象成为一个新的对象:
var obj1 = {
'a': 's1',
'b': [1,2,3,{'a':'s2'}],
'c': {'a':'s3', 'b': [4,5,6]}
};
var obj2=[1,2,3,4,5]
var obj3=$.extend(true,obj2,obj1);
console.log(obj3);
//[1, 2, 3, 4, 5, a: "s1", b: Array[4], c: Object]
以上结束。