Question

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

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

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

Était-ce utile?

La solution

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

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

Autres conseils

Une raison pour laquelle vous ne pouviez pas faire cela?

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 une chaîne, mais cela devrait fonctionner assez bien.

La réponse acceptée (et actuellement la réponse la plus populaire) présente des défauts. La réponse sert à ce cas d'utilisation spécifique, mais les commentaires ont élargi la réponse à une solution générale apparente.

Toutefois, dans certains cas, ce n’est pas une solution type-safe et elle ne traite pas tous les objets possibles. L'idée que XML n'est pas supporté a été suffisamment abordée ici et ailleurs, mais l'idée de type-safe ne l'a pas été.

L’hypothèse retenue est qu’il s’agit d’un objet de classe créé par le programmeur. Voici quelques tests que j'ai configurés (ceci est en mode strict, mais un test local). Notez les résultats du test int :

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 suit:

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à des tests en cours, il y a de bonnes raisons d'utiliser getDefinitionByName sur les méthodes du constructeur . La méthode getDefinitionByName permet:

  • Adobe développera des solutions internes aux problématiques (actuelles et futures)
  • vous n’auriez pas à changer votre code pour les futurs développements Adobe
  • vous n'êtes pas obligé de développer deux méthodes (ou plus) d'instanciation dynamique distinctes.

Cela peut être plus lent maintenant, mais à l'avenir, des améliorations pourraient être apportées par Adobe pour résoudre le problème de la vitesse.

(Par exemple, dans le passé, uint était bien plus lent dans les boucles for-boucle que int , de sorte qu'un grand nombre de codes de conversion étaient configurés de manière à utiliser le plus rapidement possible. int . C’était un problème assez simple à résoudre. Adobe a donc résolu le problème et il existe maintenant beaucoup de code qui saute à travers des obstacles inutiles pour atteindre un objectif dépassé.)

Étant donné que la méthode getDefinitionByName fonctionne correctement dans tous les cas, le code doit être développé à l'aide de cette méthode, puis permettre à Adobe de résoudre le problème de rapidité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top