ActionScript 3でクラスのインスタンスからClassオブジェクトに取得するにはどうすればよいですか?

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

質問

どのようにしてそのクラスのインスタンスからactionscriptクラス Class のインスタンスを取得しますか?

Pythonでは、これは x .__ class __ になります。 Javaでは、 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]

文字列のラウンドトリップを回避する方法はわかりませんが、十分に機能するはずです。

受け入れられた(そして現在最も一般的な回答)にはいくつかの欠陥があります。答えはこの特定のユースケースに役立ちますが、コメントは一見一般的なソリューションへの答えを拡大しました。

しかし、特定のケースではタイプセーフなソリューションではなく、可能なすべてのオブジェクトに対応しているわけではありません。 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]
...

現在のテスト以外にも、 constructor メソッドではなく getDefinitionByName を使用するのにはかなりの理由があります。 getDefinitionByName メソッドでは次のことができます。

  • アドビは(現在および将来の)問題のある分野の内部ソリューションを開発します
  • 今後のアドビの開発のためにコードを変更する必要はありません
  • 動的なインスタンス化の2つ(またはそれ以上)の別個のメソッドを開発する必要はありません。

現在は遅くなっている可能性がありますが、将来的には速度の問題に対処するAdobe側の改善が行われる可能性があります。

(たとえば、以前は uint はforループで int よりもはるかに低速であったため、より高速な int 。これは解決するのが非常に簡単な問題だったので、アドビはそれを修正し、今では不要なフープを飛び越えて時代遅れの目標を達成するコードがたくさんあります。)

getDefinitionByName メソッドはすべての場合に正しく機能するため、コードをそのメソッドを使用して開発し、Adobeが速度の問題を修正するように動作する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top