AS3使用ByteArray进行对象深度拷贝
使用ActionScript3中新提供的ByteArray类(flash.utils.ByteArray)可以创建一个对象的深度拷贝。“深 度”的意思是可以拷贝一个对象(object)的所有引用,这意味着如果你拷贝一个包含对象的数组,那么数组中的对象也被拷贝(而不是引用)。下面是一个 clone方法:
ActionScript代码:
functionclone(source:Object):*{
varcopier:ByteArray=newByteArray();
copier.writeObject(source);
copier.position=0;
return(copier.readObject());
}
注意:你需要先导入flash.utils.ByteArray;
要使用这个方法,可以使用下面的代码:
ActionScript代码:
newObjectCopy=clone(originalObject);
虽然这个方法可以深度拷贝你的对象,但是它不会一同拷贝类的类型定义。所以,如果查需要拷贝一个MyClass实例,拷贝出的对象将不在是MyClass类型。这个方法最好在普通对象上使用。
下面是我的一些测试代码:
importflash.utils.ByteArray;flash.utils.getQualifiedClassName;vara1:Array=[1,2,3];vara2:Array=clone(a1);//克隆a1,a2中保存的是a1的复制品,与a1不存在任何关系了vara3:Array=a1;//由于a1是数组,所以a3是引用a1a1.push(4);//改变a1的值trace(a1);//输出1,2,3,4trace(a2);//输出1,2,3trace(a3);//输出1,2,3,4trace("===============");varaa1:Array=[1,2,3];varaa2:Array=[11,22,aa1]//aa2中的一个元素是aa1varaa3:Array=clone(aa2);//克隆aa2,aa3中保存的是aa2的复制品,aa2中的aa1也是复制品trace(aa1);//输出1,2,3trace(aa2);//输出11,22,1,2,3aa1.push(4);//修改aa1的值trace(aa2);//输出11,22,1,2,3,4trace(aa3);//输出11,22,1,2,3trace(getQualifiedClassName(aa2));//输出Arraytrace(getQualifiedClassName(aa3));//输出Array,这说明对Array的克隆可以保持克隆结果的Array类型不变trace("===============");varaaa1:MyClass=newMyClass();//建立一个自定义类型varaaa2=clone(aaa1);//克隆自定义类型trace(aaa2.a);//输出1trace(getQualifiedClassName(aaa2));//输出Object,这说明aaa2的MyClass类型丢失了functionclone($source:Object):*{var_copier:ByteArray=newByteArray();_copier.writeObject($source);_copier.position=0;return_copier.readObject();}MyClass.as的内容package{publicclassMyClass{publicvara:int=1;publicvarb:int=2;publicfunctionMyClass(){}}}
varaaa2=MyClass(clone(aaa1));