$.extend()方法
$.extend()方法用来实现对象成员的扩展,它可以将一个对象的成员拷贝给另一个对象使用,其基本语法如下。
$.extend([deep], target, object1, [objectN])
上述代码中,target是要拷贝的目标对象,后面可以跟多个对象(object1~objectN),object1表示待拷贝的第一个对象,objectN表示待拷贝的第N个对象。当不同对象中存在相同的成员名时,后面的对象的成员会覆盖前面的对象的成员。第1个参数deep是可选参数,如果设为true表示深拷贝,默认为false表示浅拷贝。
由于$.extend()有深拷贝和浅拷贝两种方式,下面将针对这两种方式分别进行讲解。首先准备两个待操作的对象,具体代码如下。
1 var targetObj = {
2 id: 0,
3 msg: { sex: '男' }
4 };
5 var obj = {
6 id: 1,
7 name: "andy",
8 msg: { age: 18 }
9 };
在上述代码中,第3行和第8行的msg都是在对象中保存的对象,在进行深拷贝和浅拷贝操作时,处理方式会有所区别。
1. 浅拷贝
当一个对象中包含复杂数据类型(如对象)的成员时,浅拷贝会把这个成员的引用地址拷贝给目标对象,相当于“=”赋值。示例代码如下。
1 $.extend(targetObj, obj); // 浅拷贝
2 console.log(targetObj); // {id: 1, msg: {age: 18}, name: "andy"}
3 targetObj.msg.age = 20; // targetObj.msg和obj.msg是同一个对象
4 console.log(obj.msg.age); // 输出结果:20
上述代码中,第1行将obj对象浅拷贝到目标对象targetObj中,然后在第2行输出targetObj对象,可以看到obj对象已经合并到targetObj中,并且targetObj对象中原有的相同成员名的成员也被覆盖。由于浅拷贝是将obj.msg对象的引用拷贝给了targetObj.msg,因此obj.msg和targetObj.msg这两个成员是同一个对象的引用。
2. 深拷贝
深拷贝把obj对象的成员完全复制一份,再添加给目标对象targetObj,如果对象的成员中包含对象,会递归进行复制。示例代码如下。
1 $.extend(true, targetObj, obj);
2 // 深拷贝结果:{id: 1, msg: {sex: "男", age: 18}, name: "andy"}
3 console.log(targetObj);
4 targetObj.msg.age = 20; // targetObj.msg和obj.msg是不同的对象
5 console.log(obj.msg.age); // 输出结果:18
上述代码中,第1行设置$.extend()方法的第1个参数为true,表示深拷贝。深拷贝完成以后,targetObj.msg对象中的成员也发生了合并,此时的targetObj.msg和obj.msg是两个不同的对象,修改其中一个对象的成员,不影响另一个对象。