ActionScript 3.0 对象克隆

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

你可能感兴趣的:(Flex,Flash,actionscript)