Как мне перейти от экземпляра класса к объекту класса в ActionScript 3?

StackOverflow https://stackoverflow.com/questions/203969

Вопрос

Как вы получаете экземпляр класса actionscript Class из экземпляра этого класса?

В Python это было бы x.__class__;на языке Java, x.getClass();.

Я осознаю, что некоторые ужасные взломы существует для этого, но я ищу встроенное языковое средство или, по крайней мере, библиотечную процедуру, построенную на чем-то надежном.

Это было полезно?

Решение

Вы можете получить его через свойство 'constructor' базового класса 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]

Я не знаю способа избежать обхода строки, но это должно работать достаточно хорошо.

Принятый (и в настоящее время самый популярный ответ) имеет некоторые недостатки.Ответ предназначен для этого конкретного варианта использования, но комментарии расширили ответ до кажущегося общим решения.

Но в некоторых случаях это не типобезопасное решение, и оно не затрагивает все возможные объекты.Идея о том, что 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]
...

Помимо любого текущего тестирования, существует достаточно веская причина для использования getDefinitionByName над constructor методы.Тот Самый getDefinitionByName способ позволяет :

  • Adobe разработает внутренние решения для (текущих и будущих) проблемных областей
  • вам не придется изменять свой код для будущих разработок Adobe
  • вам не нужно разрабатывать два (или более) отдельных метода динамического создания экземпляра.

Сейчас это может быть медленнее, но в будущем со стороны Adobe могут появиться улучшения, которые решат проблему скорости.

(Например, раньше было так uint был намного медленнее в циклах for, чем int, таким образом , было настроено много кода преобразования для более быстрого использования int.Решить проблему было довольно просто, поэтому Adobe исправила ее, и теперь существует много кода, который перепрыгивает через ненужные препятствия для достижения устаревшей цели.)

С тех пор, как getDefinitionByName метод работает корректно во всех случаях, код должен быть разработан с использованием этого метода, а затем работать над тем, чтобы заставить Adobe устранить проблему со скоростью.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top