对象克隆可以复制出一个和已存在对象相同的对象,并且两个对象没有关联。ActionScript 3.0中克隆对象使用的是ByteArray类。以前一直以为这个方法只对数组有用,其实这个方法适用于所有的对象。方法很简单,如下:
 private function clone(obj:Object):* {
 ????????????var copier:ByteArray = new ByteArray();
 ????????????copier.writeObject(obj);
 ????????????copier.position = 0;
 ????????????return copier.readObject();
 }
clone方法可以对对象实例进行深度拷贝,这些对象包括系统内置的对象实例、自定义普通对象实例、自定义动态对象实例等等。
但是有值得注意的地方,这个方法可以深度拷贝你的对象,但是它不会一同拷贝类的类型定义。所以,如果查需要拷贝一个自定义类型实例时,拷贝出的对象将不再是自定义类型,而是Object,因此在拷贝自定义类型对象的实例时,不要进行强制类型转换,否则将会得不到想要的结果。
下面是示例程序:
-----------------------------------------------------
?
 package
 {
 ????public dynamic class Person
 ????{
 ????????public function Person()
 ????????{
 ????????}
 ????}
 }
------------------------------------------------------
 package {
 ????import flash.display.Sprite;
 ????import flash.utils.ByteArray;
 ????public class TestEx extends Sprite
 ????{
 ????????public function TestEx() {
 ????????????// copy 动态类对象
 ????????????var personA:Person = new Person();
 ????????????personA.name = "Flex";
 ????????????personA.age = 23;
 ????????????personA.sex = "Male";
 ???????????
 ????????????var personB:* = clone(personA);
????????????// 1. 上面一句如果用了as进行强制类型转换,personB == null;
????????????// 如果使用var personB:Person = Person(clone(personA)); 则会出现TypeError异常;
 
 ????????????personA.name = "Janet";
 ????????????personA.age = 25;
 ????????????personA.sex = "Female";
 ????????????trace("personA=",personA.name,personA.age,personA.sex);
 ????????????trace("personB=",personB.name,personB.age,personB.sex);
 ????????????// 2. copy 系统内置普通对象,不需要强制类型转换;
 ????????????var arr:Array = [1,2,3];
 ????????????var arrCopy:Array = clone(arr);
 ????????????arr = [3,1];
 ????????????trace("arr=",arr);
 ????????????trace("arrCopy=",arrCopy);
 ????????????// 3. copy 自定义普通对象,同样不能进行强制类型转换,否则将出现与”1“一样的情况;
 ????????????var dog:Animal = new Animal();
 ????????????dog.dogName = "Bobby";
 ????????????var copyDog:* = clone(dog);
 ????????????dog.dogName = "Papa";
 ????????????trace("Dog=",dog.dogName);
 ????????????trace("copyDog=",copyDog.dogName);
 ????????}
 ???????
 ????????private function clone(obj:Object):* {
 ????????????var copier:ByteArray = new ByteArray();
 ????????????copier.writeObject(obj);
 ????????????copier.position = 0;
 ????????????return copier.readObject();
 ????????}
 ????}
 }
 class Animal {
 ????private var _dogName:String;
 ????public function set dogName(dogName:String):void {
 ????????this._dogName = dogName;
 ????}
 ????public function get dogName():String {
 ????????return this._dogName;
 ????}
 }
 ------------------------------------------------------
输出:
personA= Janet 25 Female personB= Flex 23 Male arr= 3,1 arrCopy= 1,3 Dog= Papa copyDog= Bobby
