45 votes

Comment passer d'une instance de classe à un objet Class dans ActionScript 3?

Comment obtenez-vous une instance de la classe actionscript Class partir d'une instance de cette classe?

En Python, ce serait x.__class__ ; en Java, x.getClass(); .

Je suis conscient que certaines failles terribles existent pour ce faire, mais je recherche une installation linguistique intégrée, ou du moins une routine de bibliothèque reposant sur quelque chose de fiable.

69voto

Gerald Points 13865

Vous pouvez l'obtenir via la propriété 'constructeur' de la classe Object de base. c'est à dire:

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

14voto

fenomas Points 9565

Une raison pour laquelle tu ne pouvais pas faire ça?

 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]
 

Je ne connais pas le moyen d'éviter les allers-retours dans un String, mais cela devrait fonctionner assez bien.

14voto

iND Points 2345

L'acceptés (et actuellement les plus populaires de réponse) possède quelques défauts. La réponse pour ce cas d'utilisation spécifiques, mais les commentaires ont élargi la réponse à un semblant de solution générale.

Mais ce n'est pas une solution sûre, dans certains cas, et il ne traite pas de tous les objets possibles. L'idée que le XML n'est pas pris en charge a été adressée assez bien ici et d'ailleurs, mais le type-safe idée n'a pas.

L'hypothèse faite est que c'est un objet de classe créé par le programmeur. Ici sont quelques-uns des tests que j'ai mis en place (ce est en mode strict, mais un test local). Remarque l' int résultats du test:

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("...");

Avec TestClass défini comme:

package
{
    public class TestClass
    {
    }
}

Résultats:

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]
...

Au-delà de tout, les tests, il y a une assez bonne raison pour utiliser getDefinitionByName sur le constructor méthodes. L' getDefinitionByName méthode permet de :

  • Adobe pour développer des solutions internes pour l' (actuels et futurs) les zones problématiques
  • vous n'auriez pas à modifier votre code pour l'avenir Adobe développements
  • vous n'avez pas à développer deux (ou plus) pour séparer les méthodes de la dynamique de l'instanciation.

Il peut être plus lent maintenant, mais à l'avenir il peut y avoir des améliorations à partir d'Adobe côté qui permettrait de répondre à la question de vitesse.

(Par exemple, il a utilisé pour être que l' uint a été beaucoup plus faible dans les boucles de int, donc beaucoup de code de conversion a été configuré pour utiliser le plus rapide int. C'était assez simple question à résoudre, afin d'Adobe fixe, et maintenant, il y a beaucoup de code qui saute à travers certains inutiles cerceaux pour obtenir de la vétusté de l'objectif.)

Depuis l' getDefinitionByName méthode fonctionne correctement dans tous les cas, le code devrait être développé à l'aide de cette méthode, et ensuite travailler pour obtenir Adobe pour résoudre le problème de vitesse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X