45 votos

¿Cómo puedo obtener a partir de una instancia de una clase a un objeto de la Clase en ActionScript 3?

¿Cómo se puede obtener una instancia de la clase de actionscript Class a partir de una instancia de esa clase?

En Python, este sería x.__class__; en Java, x.getClass();.

Soy consciente de que ciertos terrible hacks que existen para hacer esto, pero estoy buscando un built-en el lenguaje de la instalación, o al menos una rutina de biblioteca construida en algo confiable.

69voto

Gerald Puntos 13865

Usted puede conseguir a través de la 'constructor' de la propiedad de la base de clase de Objeto. es decir:

var myClass:Class = Object(myObj).constructor;

14voto

fenomas Puntos 9565

Cualquier razón no se podía hacer esto?

var s:Sprite = new flash.display.Sprite();

var className:String = flash.utils.getQualifiedClassName( s );
var myClass:Class = flash.utils.getDefinitionByName( className ) as Class;

trace(className ); // flash.display::Sprite
trace(myClass); // [class Sprite]

var s2 = new myClass();
trace(s2); // [object Sprite]

No sé una manera de evitar de ida y vuelta a través de una Cadena, pero debería funcionar bastante bien.

14voto

iND Puntos 2345

La aceptan (y más populares de la actualidad de respuesta) tiene algunas fallas. La respuesta sirve para este caso de uso específico, pero los comentarios han ampliado la respuesta a lo que parece una solución general.

Pero no es un tipo de solución segura en ciertos casos, y no se refiere a todos los objetos posibles. La idea de que XML no es compatible ha sido abordado suficientemente bien aquí y en otros lugares, pero el tipo de idea segura de que no.

La suposición es que es una clase de objeto creado por el programador. Aquí están algunas de las pruebas que yo he configurado (esto es en modo estricto, sino un local de ensayo). Nota: el int resultados de la prueba:

var sprite:Sprite = new Sprite();
var xml:XML = new XML();
var testInt:int = 2;
var testClass:TestClass = new TestClass();
var testAnon:Object = {};

trace("classname 1 = " + getQualifiedClassName(sprite));
trace("myclass 1 = " + getDefinitionByName(getQualifiedClassName(sprite)));
trace("constructor a 1 = " + Object(sprite).constructor);
trace("constructor a 1 = " + (Object(sprite).constructor as Class));
trace("constructor b 1 = " + sprite["constructor"]);
trace("constructor b 1 = " + (sprite["constructor"] as Class));
trace("...");
trace("classname 2 = " + getQualifiedClassName(xml));
trace("myclass 2 = " + getDefinitionByName(getQualifiedClassName(xml)));
trace("constructor a 2 = " + Object(xml).constructor);
trace("constructor a 2 = " + (Object(xml).constructor as Class));
trace("constructor b 2 = " + xml["constructor"]);
trace("constructor b 2 = " + (xml["constructor"] as Class));
trace("...");
trace("classname 3 = " + getQualifiedClassName(testInt));
trace("myclass 3 = " + getDefinitionByName(getQualifiedClassName(testInt)));
trace("constructor a 3 = " + Object(testInt).constructor);
trace("constructor a 3 = " + (Object(testInt).constructor as Class));
trace("constructor b 3 = " + testInt["constructor"]);
trace("constructor b 3 = " + (testInt["constructor"] as Class));
trace("...");
trace("classname 4 = " + getQualifiedClassName(testClass));
trace("myclass 4 = " + getDefinitionByName(getQualifiedClassName(testClass)));
trace("constructor a 4 = " + Object(testClass).constructor);
trace("constructor a 4 = " + (Object(testClass).constructor as Class));
trace("constructor b 4 = " + testClass["constructor"]);
trace("constructor b 4 = " + (testClass["constructor"] as Class));
trace("...");
trace("classname 5 = " + getQualifiedClassName(testAnon));
trace("myclass 5 = " + getDefinitionByName(getQualifiedClassName(testAnon)));
trace("constructor a 5 = " + Object(testAnon).constructor);
trace("constructor a 5 = " + (Object(testAnon).constructor as Class));
trace("constructor b 5 = " + testAnon["constructor"]);
trace("constructor b 5 = " + (testAnon["constructor"] as Class));
trace("...");

Con TestClass se define como:

package
{
    public class TestClass
    {
    }
}

Resultados:

classname 1 = flash.display::Sprite
myclass 1 = [class Sprite]
constructor a 1 = [class Sprite]
constructor a 1 = [class Sprite]
constructor b 1 = [class Sprite]
constructor b 1 = [class Sprite]
...
classname 2 = XML
myclass 2 = [class XML]
constructor a 2 = 
constructor a 2 = null
constructor b 2 = 
constructor b 2 = null
...
classname 3 = int
myclass 3 = [class int]
constructor a 3 = [class Number]
constructor a 3 = [class Number]
constructor b 3 = [class Number]
constructor b 3 = [class Number]
...
classname 4 = src::TestClass
myclass 4 = [class TestClass]
constructor a 4 = [class TestClass]
constructor a 4 = [class TestClass]
constructor b 4 = [class TestClass]
constructor b 4 = [class TestClass]
...
classname 5 = Object
myclass 5 = [class Object]
constructor a 5 = [class Object]
constructor a 5 = [class Object]
constructor b 5 = [class Object]
constructor b 5 = [class Object]
...

Más allá de cualquier prueba actual, es bastante buena razón para usar getDefinitionByName sobre el constructor métodos. El getDefinitionByName método permite :

  • Adobe para desarrollar soluciones internas para la (actual y futuro) de las áreas problemáticas
  • usted no tiene que cambiar su código para el futuro de Adobe desarrollos
  • usted no tiene que desarrollar dos (o más) diferentes métodos de la dinámica de creación de instancias.

Puede ser más lento ahora, pero en el futuro puede haber mejoras de Adobe lado, que aborde el tema de la velocidad.

(Por ejemplo, solía ser que uint fue mucho más lento en bucles de int, por lo que un montón de código de conversión fue configurado para utilizar el más rápido int. Era un simple problema a resolver, así que Adobe fijo, y ahora hay una gran cantidad de código que salta a través de algunos pasos innecesarios para lograr un anticuado objetivo.)

Desde la getDefinitionByName método funciona correctamente en todos los casos, el código debe ser desarrollado usando ese método, y luego trabajar para obtener Adobe para solucionar el tema de la velocidad.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X