स्वीकृत (और वर्तमान में सबसे लोकप्रिय उत्तर) में कुछ त्रुटियां हैं। उत्तर इस विशिष्ट उपयोग के मामले में कार्य करता है, लेकिन टिप्पणियों ने एक सामान्य सामान्य समाधान के जवाब का विस्तार किया है।
लेकिन यह कुछ मामलों में एक प्रकार का सुरक्षित समाधान नहीं है, और यह सभी संभावित वस्तुओं को संबोधित नहीं करता है। यह विचार कि एक्सएमएल समर्थित नहीं है, यहां और कहीं और पर्याप्त रूप से संबोधित किया गया है, लेकिन टाइप-सुरक्षित विचार नहीं है।
धारणा यह है कि यह प्रोग्रामर द्वारा बनाई गई एक क्लास ऑब्जेक्ट है। यहां कुछ परीक्षण दिए गए हैं जिन्हें मैंने स्थापित किया है (यह सख्त मोड में है, लेकिन स्थानीय परीक्षण)। नोट 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
विधि की अनुमति देता है:
- एडोब के लिए (वर्तमान और भविष्य) समस्याग्रस्त क्षेत्रों आंतरिक समाधान विकसित करने के
- आप भविष्य एडोब के घटनाक्रम के लिए अपने कोड बदलने की जरूरत नहीं होगी
- आप दो विकसित करने के लिए की जरूरत नहीं है (या अधिक) गतिशील त्वरण के विभिन्न तरीकों।
यह धीमा हो सकता है, लेकिन भविष्य में एडोब की तरफ से सुधार हो सकते हैं जो गति मुद्दे को संबोधित करेंगे।
(उदाहरण के लिए, यह है कि uint
int
से-छोरों के लिए में अब तक धीमी थी इस्तेमाल किया है, तो रूपांतरण कोड का एक बहुत तेजी से int
उपयोग करने के लिए स्थापित किया गया था। यह हल करने के लिए एक काफी सरल मुद्दा था, इसलिए एडोब इसे ठीक कर दिया, और अब बहुत सारे कोड हैं जो पुराने लक्ष्य को प्राप्त करने के लिए कुछ अनावश्यक हुप्स के माध्यम से कूदते हैं।)
चूंकि getDefinitionByName
विधि सभी मामलों में सही तरीके से काम करती है, इसलिए उस विधि का उपयोग करके कोड विकसित किया जाना चाहिए, और उसके बाद एडोब को गति समस्या को ठीक करने के लिए काम करना चाहिए।
जहाँ तक मुझे पता के रूप में यह मेरी अपनी मणि है, हालांकि वस्तु वर्ग के लिए एडोब डॉक्स निर्माता संपत्ति और क्या है का उल्लेख है। मैंने इसे कहीं और नहीं देखा है। – Gerald
यहां कुछ और चर्चा: http://joshblog.net/2009/05/11/retrieve-the-class-used-to-instantiate-an-object-in-as3/ एक मामूली विकल्प होगा करें: var classRef: कक्षा = myObj ["कन्स्ट्रक्टर"] कक्षा के रूप में; यह सख्त कंपाइलर चेक के आसपास भी हो जाता है। सुनिश्चित नहीं है कि कौन सा बेहतर प्रदर्शन करता है। माइक चैम्बर – mikechambers
यह उन ऑब्जेक्ट्स पर काम नहीं करता है जो एक्सएमएल जैसे प्रॉक्सी को उपclass करते हैं। http://stackoverflow.com/questions/468925/in-actionscript3-how-do-you-get-a-reference-to-an-objects-class/472300#472300 –