你怎么得到的一个实例actionscript类 Class 从一个实例,这类?

在蟒蛇,这将是 x.__class__;在爪哇, x.getClass();.

我知道, 某些可怕的黑客 存在,要做到这一点,但是我在寻找一个内置的语言设施,或者至少一个图书馆常规建造的东西可靠。

有帮助吗?

解决方案

您可以通过基础Object类的'constructor'属性获取它。即:

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避免往返,但它应该运行得很好。

所接受(目前最受欢迎的答案)有一些缺陷。答案作为这个具体使用情况,但该意见已经扩大了的答案似乎一般的解决方案。

但它不是一个种类安全的解决方案在某些情况下,它没有解决的所有可能的对象。这个想法,XML不支持已经足够好的在这里和其他地方,但这类安全的想法也没有。

所作的假设是,它是一个类对象的创建程序员。这里有一些试验,我设立(这是在严格的模式,但当地的试验)。注意到 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("...");

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

超越当前的任何测试,有相当好的理由使用 getDefinitionByNameconstructor 方法。的 getDefinitionByName 法允许:

  • Adobe开发内部解决办法的(当前和未来的)问题区域
  • 你会不会改变你的代码,用于未来Adobe的事态发展
  • 你不需要发展两个(或更多)的单独方法的动态的实例。

它可能较慢,但在未来可能的改进,从Adobe面,将地址的速度问题。

(例如,它曾经是 uint 是远远低于用于环比 int, ,这样大量的代码转换是为了使用更快的 int.这是一个相当简单的问题来解决,因此Adobe固定的,现在有大量的代码,跳过一些不必要的篮球实现一个过时的目标。)

由于 getDefinitionByName 方法工作正确地在所有情况下,代码应当制定使用这一方法,然后工作得到Adobe修复速度问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top