在ActionScript 3中如何从类的实例获取到类对象?

你如何从该类的一个实例获得一个actionscript类的实例?

在Python中,这将是x.__class__ ; 在Java中, x.getClass();

我知道有一些可怕的黑客存在这样做,但我正在寻找一个内置的语言设施,或者至less是一个build立在可靠的东西上的图书馆例程。

您可以通过基类Object类的“构造函数”属性来获取它。 即:

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

任何理由,你不能这样做?

 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] 

我不知道一个方法来避免通过一个string往返,但它应该工作得很好。

接受的(现在最stream行的答案)有一些缺陷。 答案适用于这个具体的用例,但是这些评论已经将答案扩展到看似普遍的解决scheme。

但在某些情况下,这不是一个types安全的解决scheme,并没有涉及所有可能的对象。 XML不被支持的想法已经在这里和其他地方得到了足够的解决,但types安全的想法却没有。

所做的假设是它是由程序员创build的类对象。 这里是我设置的一些testing(这是严格的模式,但本地testing)。 注意inttesting结果:

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

TestClass定义为:

 package { public class TestClass { } } 

结果:

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

除了任何当前的testing之外,在constructor方法上使用getDefinitionByName还有很好的理由。 getDefinitionByName方法允许:

  • Adobe为(当前和未来)问题领域开发内部解决scheme
  • 您将不必为将来的Adobe开发更改代码
  • 您不必开发两个(或更多)单独的dynamic实例化方法。

现在可能会比较慢,但是将来Adobe可能会有一些改进来解决速度问题。

(例如,它曾经是因为uint比for循环要慢得多,所以设置了很多转换代码来使用更快的int ,这是一个相当简单的问题,所以Adobe解决了这个问题,现在有很多代码跳过一些不必要的循环来实现过时的目标。)

由于getDefinitionByName方法在所有情况下都能正常工作,因此应该使用该方法开发代码,然后使Adobe能够解决速度问题。