2008-10-15 73 views

回答

69

您可以通過基礎對象類的「構造函數」屬性獲取它。即:

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

據我所知,這是我自己的寶石,雖然Adobe文檔的Object類提到了構造函數屬性和它是什麼。我從來沒有見過它在其他地方以這種方式使用。 – Gerald 2008-10-15 11:12:54

14

任何你無法做到的原因?

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] 

我不知道一種方法來避免通過字符串往返,但它應該工作得很好。

+2

這會工作,但getQualifiedClassName和getDefinitionByName的性能很差。 邁克室 – mikechambers 2009-07-13 21:25:23

14

接受的(當前最流行的答案)有一些缺陷。答案適用於這個具體的用例,但評論已經將答案擴展到看似普遍的解決方案。

但是它在某些情況下不是類型安全的解決方案,並且它不涉及所有可能的對象。 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在for循環比int慢得多,所以很多的轉換代碼被設置爲使用更快的int,這是一個相當簡單的問題來解決,這樣的Adobe修復它,現在有很多代碼跳過一些不必要的環節來實現過時的目標。)

由於getDefinitionByName方法在所有情況下都能正常工作,因此應該使用該方法開發代碼,然後使用Adobe來解決速度問題。

相關問題