学科分类

$.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是两个不同的对象,修改其中一个对象的成员,不影响另一个对象。

点击此处
隐藏目录