2008-10-15 15 views
44

आप उस वर्ग के उदाहरण से क्रियालेख वर्ग Class का उदाहरण कैसे प्राप्त करते हैं?एक्शनस्क्रिप्ट 3 में क्लास ऑब्जेक्ट में कक्षा के उदाहरण से मैं कैसे प्राप्त करूं?

पायथन में, यह x.__class__ होगा; जावा में, x.getClass();

मुझे पता है कि certain terrible hacks ऐसा करने के लिए मौजूद है, लेकिन मैं एक अंतर्निहित भाषा सुविधा की तलाश में हूं, या कम से कम एक पुस्तकालय दिनचर्या कुछ भरोसेमंद पर बनाया गया है।

उत्तर

69

आप मूल ऑब्जेक्ट क्लास की 'कन्स्ट्रक्टर' संपत्ति के माध्यम से इसे प्राप्त कर सकते हैं। i.e .:

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

जहाँ तक मुझे पता के रूप में यह मेरी अपनी मणि है, हालांकि वस्तु वर्ग के लिए एडोब डॉक्स निर्माता संपत्ति और क्या है का उल्लेख है। मैंने इसे कहीं और नहीं देखा है। – Gerald

+1

यहां कुछ और चर्चा: http://joshblog.net/2009/05/11/retrieve-the-class-used-to-instantiate-an-object-in-as3/ एक मामूली विकल्प होगा करें: var classRef: कक्षा = myObj ["कन्स्ट्रक्टर"] कक्षा के रूप में; यह सख्त कंपाइलर चेक के आसपास भी हो जाता है। सुनिश्चित नहीं है कि कौन सा बेहतर प्रदर्शन करता है। माइक चैम्बर – mikechambers

+6

यह उन ऑब्जेक्ट्स पर काम नहीं करता है जो एक्सएमएल जैसे प्रॉक्सी को उपclass करते हैं। http://stackoverflow.com/questions/468925/in-actionscript3-how-do-you-get-a-reference-to-an-objects-class/472300#472300 –

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

14

स्वीकृत (और वर्तमान में सबसे लोकप्रिय उत्तर) में कुछ त्रुटियां हैं। उत्तर इस विशिष्ट उपयोग के मामले में कार्य करता है, लेकिन टिप्पणियों ने एक सामान्य सामान्य समाधान के जवाब का विस्तार किया है।

लेकिन यह कुछ मामलों में एक प्रकार का सुरक्षित समाधान नहीं है, और यह सभी संभावित वस्तुओं को संबोधित नहीं करता है। यह विचार कि एक्सएमएल समर्थित नहीं है, यहां और कहीं और पर्याप्त रूप से संबोधित किया गया है, लेकिन टाइप-सुरक्षित विचार नहीं है।

धारणा यह है कि यह प्रोग्रामर द्वारा बनाई गई एक क्लास ऑब्जेक्ट है। यहां कुछ परीक्षण दिए गए हैं जिन्हें मैंने स्थापित किया है (यह सख्त मोड में है, लेकिन स्थानीय परीक्षण)। नोट 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 विधि की अनुमति देता है:

  • एडोब के लिए (वर्तमान और भविष्य) समस्याग्रस्त क्षेत्रों आंतरिक समाधान विकसित करने के
  • आप भविष्य एडोब के घटनाक्रम के लिए अपने कोड बदलने की जरूरत नहीं होगी
  • आप दो विकसित करने के लिए की जरूरत नहीं है (या अधिक) गतिशील त्वरण के विभिन्न तरीकों।

यह धीमा हो सकता है, लेकिन भविष्य में एडोब की तरफ से सुधार हो सकते हैं जो गति मुद्दे को संबोधित करेंगे।

(उदाहरण के लिए, यह है कि uintint से-छोरों के लिए में अब तक धीमी थी इस्तेमाल किया है, तो रूपांतरण कोड का एक बहुत तेजी से int उपयोग करने के लिए स्थापित किया गया था। यह हल करने के लिए एक काफी सरल मुद्दा था, इसलिए एडोब इसे ठीक कर दिया, और अब बहुत सारे कोड हैं जो पुराने लक्ष्य को प्राप्त करने के लिए कुछ अनावश्यक हुप्स के माध्यम से कूदते हैं।)

चूंकि getDefinitionByName विधि सभी मामलों में सही तरीके से काम करती है, इसलिए उस विधि का उपयोग करके कोड विकसित किया जाना चाहिए, और उसके बाद एडोब को गति समस्या को ठीक करने के लिए काम करना चाहिए।

संबंधित मुद्दे

 संबंधित मुद्दे