如何從該類的實例獲取動作類Class
的實例?如何在ActionScript 3中從類的實例獲取類對象?
在Python中,這將是x.__class__
;在Java中,x.getClass();
。
我知道certain terrible hacks存在這樣做,但我正在尋找一個內置的語言設施,或至少建立在可靠的東西上的庫例程。
如何從該類的實例獲取動作類Class
的實例?如何在ActionScript 3中從類的實例獲取類對象?
在Python中,這將是x.__class__
;在Java中,x.getClass();
。
我知道certain terrible hacks存在這樣做,但我正在尋找一個內置的語言設施,或至少建立在可靠的東西上的庫例程。
您可以通過基礎對象類的「構造函數」屬性獲取它。即:
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]
我不知道一種方法來避免通過字符串往返,但它應該工作得很好。
這會工作,但getQualifiedClassName和getDefinitionByName的性能很差。 邁克室 – mikechambers 2009-07-13 21:25:23
接受的(當前最流行的答案)有一些缺陷。答案適用於這個具體的用例,但評論已經將答案擴展到看似普遍的解決方案。
但是它在某些情況下不是類型安全的解決方案,並且它不涉及所有可能的對象。 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解決速度問題的改進。
(例如,它使用的是uint
在for循環比int
慢得多,所以很多的轉換代碼被設置爲使用更快的int
,這是一個相當簡單的問題來解決,這樣的Adobe修復它,現在有很多代碼跳過一些不必要的環節來實現過時的目標。)
由於getDefinitionByName
方法在所有情況下都能正常工作,因此應該使用該方法開發代碼,然後使用Adobe來解決速度問題。
據我所知,這是我自己的寶石,雖然Adobe文檔的Object類提到了構造函數屬性和它是什麼。我從來沒有見過它在其他地方以這種方式使用。 – Gerald 2008-10-15 11:12:54