对象克隆可以复制出一个和已存在对象相同的对象,并且两个对象没有关联。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