我有各种船型的游戏。我的Ship
类有一个静态数组,其中包含每个类型中的一个。每当我做一个新的Ship
(除了初始化这个数组时),我想使它成为我原型数组中现有的Ship
对象之一的克隆。AS3 - 克隆物体
1 - 如何运行一个Ship
对象中的所有属性并将它们分配给第二个Ship
对象?
2 - 如何查看属性是否为对象或像String
或int
这样的基本类型?我的Ship
类中的一些对象需要克隆,有些只是需要保持不变的引用。
我有各种船型的游戏。我的Ship
类有一个静态数组,其中包含每个类型中的一个。每当我做一个新的Ship
(除了初始化这个数组时),我想使它成为我原型数组中现有的Ship
对象之一的克隆。AS3 - 克隆物体
1 - 如何运行一个Ship
对象中的所有属性并将它们分配给第二个Ship
对象?
2 - 如何查看属性是否为对象或像String
或int
这样的基本类型?我的Ship
类中的一些对象需要克隆,有些只是需要保持不变的引用。
一种选择,可以说是最灵活的,是定义为每个需要复制类的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)
{
}
要通过一个艘船对象的所有属性运行,并将其分配给第二:
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”。
可以使用是严格匹配的关键字。例如如果(东西是数组) – Marty
我得到了一些语法错误,因为(var in shipobj2) var = shipobj1 [var];' –
这可能是因为“var”是一个保留字或者因为你称它为obj2 for循环中的statement和obj1。 – JeremyFromEarth
我想我会不得不做你的第一个建议,虽然这有问题,如果我添加新的变量到我的类,我将不得不添加新行克隆()每次。 –
也有优势。也许你可能想设置一个默认值,如果没有设置值,或者你可能想克隆一些道具而不是其他的道具。使用describeType的自动化方法不会太灵活。 – JeremyFromEarth