我有一个有各种船型的游戏。我的Ship
类有一个静态数组,其中包含每种类型中的一种。每当我创建一个新的Ship
时(除了初始化此数组时),我想让它成为我原型数组中现有Ship
个对象之一的克隆。
1 - 如何在一个Ship
对象中运行所有属性并将它们分配给第二个Ship
对象?
2 - 如何查看属性是对象还是基本类型,如String
或int
?我的Ship
类中的一些对象需要克隆,有些只是需要保持不变的引用。
答案 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是保留字。