Wie kann ich von einer Instanz einer Klasse zu einem Klasse-Objekt in Actionscript 3 bekommen?
-
03-07-2019 - |
Frage
Wie kann man eine Instanz der Klasse Action Class
von einer Instanz dieser Klasse bekommen?
In Python, würde dies x.__class__
werden; in Java, x.getClass();
.
Ich bin mir bewusst, dass diese existieren zu tun , aber ich bin für eine eingebaute Sprach Anlage suchen, oder zumindest eine Bibliotheksroutine auf etwas gebaut zuverlässig.
Lösung
Sie können es durch die ‚Konstruktor‘ Eigenschaft des Basisobjektklasse erhalten. das heißt:.
var myClass:Class = Object(myObj).constructor;
Andere Tipps
Jeder Grund, warum Sie dies nicht tun könnten?
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]
Ich weiß nicht, einen Weg Round-Tripping durch einen String zu vermeiden, aber es sollte gut genug, um arbeiten.
Die akzeptiert (und zur Zeit populärste Antwort) hat einige Mängel. Die Antwort dient für diesen speziellen Anwendungsfall, aber die Kommentare haben die Antwort auf eine scheinbar allgemeine Lösung erweitert.
Aber es ist nicht eine typsichere Lösung in bestimmten Fällen, und es bezieht sich nicht auf alle möglichen Objekte. Die Idee, dass XML ist nicht gut genug, um hier und an anderer Stelle angesprochen unterstützt wurde, aber die typsichere Idee hat, nicht.
gemacht Die Annahme ist, dass es ein Klassenobjekt vom Programmierer erstellt. Hier sind einige der Tests, die ich einrichten (dies ist im Strict-Modus, sondern ein lokaler Test). Beachten Sie die int
Testergebnisse:
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("...");
Mit TestClass
wie folgt definiert:
package
{
public class TestClass
{
}
}
Ergebnisse:
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]
...
Darüber hinaus alle aktuellen Tests, gibt es ziemlich guten Grund getDefinitionByName
über die constructor
Methoden zu verwenden. Die getDefinitionByName
Methode erlaubt:
- Adobe interne Lösungen für die (derzeitigen und künftigen) problematische Bereiche entwickeln
- Sie müssen nicht Ihren Code für zukünftige Entwicklungen Adobe ändern
- Sie haben nicht zwei zu entwickeln (oder mehr) verschiedene Methoden der dynamischen Instanziierung.
Es kann langsamer sein, jetzt, aber in Zukunft könnte es Verbesserungen von der Adobe-Seite sein, der die Geschwindigkeit Problem zu beheben wäre.
(Zum Beispiel ist es verwendet, dass uint
zu sein war viel langsamer in for-Schleifen als int
, so viele Conversion-Code wurde eingerichtet, um die schnellere int
zu verwenden. Es war ein ziemlich einfaches Problem zu lösen, so Adobe Fest es, und jetzt gibt es eine Menge Code, der ein veraltetes Ziel zu erreichen.)
Da die getDefinitionByName
Methode in allen Fällen korrekt funktioniert, Code sollte mit dieser Methode entwickelt werden, und dann arbeitet Adobe zu erhalten, die Geschwindigkeit Problem zu beheben.