加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ActionScript 3.0 对象克隆 & 深拷贝

发布时间:2020-12-15 04:54:17 所属栏目:百科 来源:网络整理
导读:对象克隆可以复制出一个和已存在对象相同的对象,并且两个对象没有关联。ActionScript 3.0中克隆对象使用的是ByteArray类。以前一直以为这个方法只对数组有用,其实这个方法适用于所有的对象。方法很简单,如下: private function clone(obj:Object):* { ??


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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读