Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 AS3-克隆对象_Actionscript 3_Oop - Fatal编程技术网

Actionscript 3 AS3-克隆对象

Actionscript 3 AS3-克隆对象,actionscript-3,oop,Actionscript 3,Oop,我有一个游戏,有各种各样的船型。我的Ship类有一个静态数组,其中包含每种类型中的一种。每当我创建一个新的Ship(初始化此数组时除外),我都希望将其作为原型数组中一个现有Ship对象的克隆 1-如何在一个Ship对象中运行所有属性,并将它们分配给第二个Ship对象 2-如何查看属性是对象还是基本类型,如String或int?myShip类中的某些对象需要克隆,而某些对象只是需要保持不变的引用。要遍历一个Ship对象的所有属性并将其分配给另一个对象,请执行以下操作: shipobj1:Ship

我有一个游戏,有各种各样的船型。我的
Ship
类有一个静态数组,其中包含每种类型中的一种。每当我创建一个新的
Ship
(初始化此数组时除外),我都希望将其作为原型数组中一个现有
Ship
对象的克隆

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


2-如何查看属性是对象还是基本类型,如
String
int
?my
Ship
类中的某些对象需要克隆,而某些对象只是需要保持不变的引用。

要遍历一个Ship对象的所有属性并将其分配给另一个对象,请执行以下操作:

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

shipobj2:Ship = new Ship();

for (item in shipobj2)
    item = shipobj1[item];
检查属性值是否是可以使用typeof的对象。这种方法的局限性在于,只返回6种可能的类型:boolean、function、number、object、string和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”替换为“item”,因为var是一个保留字。

一个选项,可以说是最灵活的,是为需要克隆的每个类定义克隆方法,例如:

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() ); 
}
我见过这样的实例,这种方法不适用于克隆自定义类的实例,特别是像sprite这样的视图类

另一种方法是使用
flash.utils
包中的
DescripteType
。使用
describeType
可以迭代对象的属性

下面是一个使用
descripbetype
检查作为我编写的文档的一部分的对象的属性的示例

至于检查属性的类型,您可以使用
descripbetype
或者您也可以使用
is
操作符,如下所示:

if( myObj is SomeClass )
{

}

if( myObj is OtherClass )
{

}

您可以使用is关键字进行更严格的匹配。e、 g.如果(某个东西是数组)我得到了一些语法错误,比如(shipobj2中的var)var=shipobj1[var]这可能是因为“var”是一个保留字,或者是因为您在for语句中调用它obj2,而在循环中调用它obj1。我在示例代码中使用“var”作为变量名的缺点是将其替换为“item”。我想我将不得不执行您的第一个建议,尽管如果我在类中添加新变量,我每次都要给clone()添加新行。这也有好处。如果没有设置值,您可能希望设置默认值,或者您可能希望克隆一些道具而不是其他道具。使用describeType的自动化方法不会太灵活。