对象克隆可以复制出一个和已存在对象相同的对象,并且两个对象没有关联。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,因此在拷贝自定义类型对象的实例时,不要进行强制类型转换,否则将会得不到想要的结果。
下面是示例程序:
-----------------------------------------------------
/**
* 动态类Person
* 文件:Person.as
*/
package
{
public dynamic class Person
{
public function Person()
{
}
}
}
------------------------------------------------------
/**
* 测试类: TestEx
* 文件: TestEx.as
*/
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, 2, 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,2,1
arrCopy= 1,2,3
Dog= Papa
copyDog= Bobby