对于基本类型,无所谓深浅复制。
深浅复制只要是对于引用类型来说的。一句话概括来说就是:引用类型是否指向了新的内存地址。
例如对于数组来说,因为数组不是类型化数组,所以你可以往数组里面放置基本类型数据和引用类型数据,对于包含引用类型的数据的数组,讨论才有意义。
var array:Array = [1,2,3,{name:"kenny"}]; var shallowCopyArray:Array = array.concat(); var cloneArray:Array = ObjectUtil.clone(array) as Array;
对于浅复制,shallowCopyArray最后一个元素和原始数组最后一个元素的引用地址是一样;
对于深复制,cloneArray的最后一个元素和原始数组最后一个元素的引用地址是不一样;
内容地址的不一样,导致你操作的是否是同一个对象。
对于自定义对象的复制,譬如说自己提供一个clone()方法提供自身的复制对象。一般来说涉及到原型模式。
如果自定义对象中包含了另一个对象(自定义的),在你复制自身之前,需要做一些事情,不然它复制出来的对象就是一个Object啦,而非你自定义的对象。
App:
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600""> <fx:Script> <![CDATA[ import com.mode.clone.Company; import com.mode.clone.Person; protected function button1_clickHandler(event:MouseEvent):void { var person:Person = new Person(); person.name = "kenny"; var company:Company = new Company(); company.name = "lomboard"; person.company = company; var clonePerson:Person = person.clone(); // 去查看下clonePerson中的company是否是一个Company对象还是一个Object } ]]> </fx:Script> <s:Button click="button1_clickHandler(event)"/> </s:Application>
Person:
package com.mode.clone { import flash.net.registerClassAlias; import mx.collections.ArrayCollection; import mx.utils.ObjectUtil; public class Person { public var name:String; public var company:Company;//另一个自定义对象 public function clone():Person { registerClassAlias("com.mode.clone.Company",Company);//对一个对象进行编码时,保留该对象的类(类型)。 registerClassAlias("com.mode.clone.Person",Person); //如果没有上面的编码,你就不能强制转换为person return ObjectUtil.copy(this) as Person; } } }
Company:
package com.mode.clone { public class Company { public var name:String; } }
相关推荐
- **浅拷贝**:仅复制对象的第一层属性,深层属性仍然共享引用。 - **深拷贝**:完全复制对象的所有层级属性,包括嵌套对象。 **实现深拷贝的方法**: - **递归**:手动遍历对象的每一层属性,递归地进行复制。 - ...
12. **浅复制与深复制**: - 浅复制:`slice()`、`concat()`、`Object.assign()`等方法,仅适用于简单对象和数组。 - 深复制:`JSON.parse(JSON.stringify())`(有局限性)、`lodash.cloneDeep()`等。 13. **...
- **浅拷贝**:只复制对象的第一层属性,如果属性是引用类型,则只是拷贝了该引用地址。 - 可以使用`Object.assign()`或扩展运算符`{...obj}`实现。 - **深拷贝**:完全复制对象的所有层次,生成一个与原对象完全...
因此,对于引用类型的属性(如数组或对象),浅拷贝无法完全复制出一个新的实例,而是共享原有的实例。例如,在JavaScript中,使用`Object.assign()`或扩展运算符`{...obj}`时,通常会产生浅拷贝的效果。 - **深拷贝...
深拷贝是创建一个对象的完全独立副本,而浅拷贝只复制对象的引用;ES6引入了let、const、箭头函数、Promise等新特性;原型链是JavaScript继承的核心,通过__proto__属性连接;call、apply、bind都用于改变函数调用的...