2011-12-11 20 views
9

Tengo un juego con una variedad de tipos de barcos. Mi clase Ship tiene una matriz estática que contiene uno de cada uno de los tipos en ella. Cada vez que hago un nuevo Ship (que no sea al inicializar este conjunto), quiero convertirlo en un clon de uno de los objetos existentes Ship en mi matriz de prototipos.AS3 - Clonar un objeto

1 - ¿Cómo puedo ejecutar todas las propiedades en un objeto Ship y asignarlas a un segundo objeto Ship?

2 - ¿Cómo puedo ver si una propiedad es un objeto o un tipo básico como String o int? Algunos de los objetos de mi clase Ship deben clonarse, y algunos son solo referencias que deben permanecer igual.

Respuesta

19

Una opción, sin duda el más ágil, sería definir métodos de clones para cada clase que necesita clonar, tales como:

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

Otra opción es clonar un objeto utilizando la clase ByteArray como este ejemplo de la documentación de Adobe:

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

he visto casos en los que este enfoque no funciona para la clonación de instancias de clases personalizadas, ver específicamente clases como Sprites.

Otro enfoque es utilizar describeType del paquete flash.utils. Con describeType puede recorrer las propiedades de un objeto.

Aquí hay un ejemplo del uso de describeType para inspeccionar las propiedades de un objeto que forma parte de un utils lib que escribí.

En cuanto a la comprobación del tipo de la propiedad, puede utilizar describeType o también puede utilizar el operador is así:

if(myObj is SomeClass) 
{ 

} 

if(myObj is OtherClass) 
{ 

} 
+1

Creo que tendré que hacer su primera sugerencia, aunque esto tiene el problema de si agrego nuevas variables a mis clases, tendré que agregar nuevas líneas a clone() cada vez. –

+3

Eso tiene ventajas también. Quizás desee establecer un valor predeterminado si no se establece ningún valor o si desea clonar algunos accesorios y otros no. Un enfoque automatizado que utiliza describeType no sería demasiado flexible. – JeremyFromEarth

4

correr a través de todas las propiedades de un objeto barco y asignarlos a una segunda:

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

shipobj2:Ship = new Ship(); 

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

comprobar si un valor de propiedad es un objeto que podría utilizar typeof. La limitación de esto es que solo se devuelven 6 tipos posibles: booleano, función, número, objeto, cadena y xml. Entonces, por ejemplo, si necesita saber si una propiedad es una matriz, realmente no puede hacer eso con typeof ya que eso realmente devolvería "object" ya que "array" no es una de las 6 opciones, pero si solo está ocupa de la identificación de los tipos simples como números y cadenas en comparación con otras cosas que debe hacer el truco:

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

EDIT: Sustituido "var" variable "elemento", ya que var es una palabra reservada.

+0

Puede utilizar la palabra clave es para la coincidencia estricta. p.ej. if (algo es Array) – Marty

+0

Obtengo una serie de errores de sintaxis con 'for (var en shipobj2) var = shipobj1 [var];' –

+0

Eso podría deberse a que "var" es una palabra reservada o porque la llama obj2 en para enunciado y obj1 dentro del ciclo. – JeremyFromEarth