AS3 - 克隆一个对象

时间:2011-12-11 04:37:40

标签: actionscript-3 oop

我有一个有各种船型的游戏。我的Ship类有一个静态数组,其中包含每种类型中的一种。每当我创建一个新的Ship时(除了初始化此数组时),我想让它成为我原型数组中现有Ship个对象之一的克隆。

1 - 如何在一个Ship对象中运行所有属性并将它们分配给第二个Ship对象?

2 - 如何查看属性是对象还是基本类型,如Stringint?我的Ship类中的一些对象需要克隆,有些只是需要保持不变的引用。

2 个答案:

答案 0 :(得分:19)

可以说最敏捷的一个选择是为您需要克隆的每个类定义克隆方法,例如:

class Ship
{
    public var prop1:Number;
    public var otherClassInstance:OtherClass;
    public function clone():Ship
    {
        var result:Ship = new Ship();
        result.prop1 = this.prop1;
        result.otherClassInstance = this.otherClassInstance.clone()
    }
}

class OtherClass
{
    public var prop1:Number;
    public function clone():OtherClass
    {
        var result:OtherClass = new OtherClass();
        result.prop1 = this.prop1;
    }
}

另一种选择是使用ByteArray类克隆对象,如Adobe文档中的此示例所示:

function clone( source:Object ):* 
{ 
    var myBA:ByteArray = new ByteArray(); 
    myBA.writeObject( source ); 
    myBA.position = 0; 
    return( myBA.readObject() ); 
}

我见过这种方法不能用于克隆自定义类实例的实例,特别是像Sprites这样的视图类。

另一种方法是使用describeType包中的flash.utils。使用describeType,您可以遍历对象的属性。

以下是使用describeType检查对象属性的示例,该对象是我写的utils lib的一部分。

至于检查属性的类型,您可以使用describeType,也可以使用is运算符,如下所示:

if( myObj is SomeClass )
{

}

if( myObj is OtherClass )
{

}

答案 1 :(得分:4)

要遍历一个船舶对象的所有属性并将它们分配给第二个:

shipobj1:Ship = new Ship();
//set values for all shipobj1 properties

shipobj2:Ship = new Ship();

for (item in shipobj2)
    item = shipobj1[item];

检查属性值是否为对象,可以使用typeof。这种情况的局限性在于只返回了6种可能的类型:布尔值,函数,数字,对象,字符串和xml。因此,例如,如果你需要知道一个属性是否是一个数组你不能真正用typeof做那个,因为它实际上会返回“对象”,因为“数组”不是6个选项之一,但如果你只是关注识别简单类型,如数字和字符串与其他东西,它应该做的伎俩:

if(typeof item == "object")
  // do whatever with object
else if(typeof item == "string")
  // do whatever with string
//etc, etc.

编辑:将变量“var”替换为“item”,因为var是保留字。