2011-12-11 77 views
9

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

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

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

回答

19

一种选择,可以说是最灵活的,是定义为每个需要复制类的clone方法,如:

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()); 
} 

我见过的情况,其中这种方法不适用于克隆的自定义类的实例的工作,尤其是视图类,如精灵。

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

这是使用describeType来检查作为我写的utils lib的一部分的对象的属性的示例。

至于检查属性的类型,你可以使用describeType,或者您也可以使用is操作是这样的:

if(myObj is SomeClass) 
{ 

} 

if(myObj is OtherClass) 
{ 

} 
+1

我想我会不得不做你的第一个建议,虽然这有问题,如果我添加新的变量到我的类,我将不得不添加新行克隆()每次。 –

+3

也有优势。也许你可能想设置一个默认值,如果没有设置值,或者你可能想克隆一些道具而不是其他的道具。使用describeType的自动化方法不会太灵活。 – JeremyFromEarth

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来实现,因为这实际上会返回“object”,因为“array”不是6个选项之一,但如果你只是有关确定简单类型,如与其他的东西,它应该做的伎俩数字和字符串:

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

编辑:以“项目”,因为var是一个保留字替换变量“VAR”。

+0

可以使用是严格匹配的关键字。例如如果(东西是数组) – Marty

+0

我得到了一些语法错误,因为(var in shipobj2) var = shipobj1 [var];' –

+0

这可能是因为“var”是一个保留字或者因为你称它为obj2 for循环中的statement和obj1。 – JeremyFromEarth