Sometimes, you want to know the datatype of an object at runtime. The most common thing to do in ActionScript 3 is use the
is keyword to see if an object is an instance of a specific class. For example, you use
exampleObject is Sprite to see if something is a Sprite (or any subclass of Sprite). However, there are times when you want to use the actual class in your code to create a new instance, or to do something a little more arcane. There are a couple simple ways to access the datatype of an object and place it in a variable.
Method 1: Combine a couple flash.utils functions
The first way to get an object’s class at runtime takes requires calls to a couple useful functions that live in the
import flash.utils.getQualifiedClassName; import flash.utils.getDefinitionByName; var example:Sprite = new Sprite(); var exampleName:String = getQualifiedClassName( example ); var exampleType:Class = getDefinitionByName( exampleName ) as Class; trace( exampleType == Sprite ); //output: true
Start by calling the function
flash.utils.getQualifiedClassName(), and pass in the object. It will return a string that includes the full class name, including the package. For example, passing in a Sprite object will return the String value
"flash.display::Sprite". Next, call the function
flash.utils.getDefinitionByName(), and pass in the String value that you just received. It will return a reference to the object’s class. An equality check is included in the code above to demonstrate that
exampleType is actually the Sprite class.
Are you curious about that
::part of the fully-qualified class name? Shouldn’t it be
.instead? Check out my post Packages are actually namespaces in ActionScript 3 to learn more.
Mainly, I’ve included this first method of extracting a class from an instance because the two utility functions used in the example above are quite useful in other contexts. However, the second method is much simpler, if a little more obscure.
Method 2: The
Every object in ActionScript 3 has a property named
constructor. According to the documentation, it is a reference to the datatype used to instantiate the object. In other words, every object can tell you the Class (or Function, since AS3 still supports ECMAScript function prototypes) used to create it with one simple property lookup. How simple!
var example:Sprite = new Sprite(); var exampleType:Class = Object( example ).constructor; trace( exampleType == Sprite); //output: true
What’s interesting, and not immediately obvious (unless you read the documentation thoroughly), is that if you try to access the
constructor property in the strict mode (which is on by default in the AS3 compiler), you’ll get a compiler error. However, the documentation notes that dynamic objects don’t cause this error. We can use that fact to create an easy workaround because everything is an Object, and Object happens to be a dynamic class. As you can see in the code above, a simple cast makes the error go away.
Personally, I prefer the second method because it takes only a simple property lookup, and it requires no calls to functions with long names. Again, though, those functions can be quite useful in other contexts, so it’s worth making note of them.
Method #2 is sweet, and totally non-obvious. Thanks!
Thank you. I love you. Seriously, I’ve been scouring as3 message boards all over the internet looking for a solution to “duplicate” a movieClip dynamically and this does the job perfectly. I will spread this link around for all the others who have this problem.
I just can’t get it how can you duplicate a MovieClip with this. Could anyone make a tutorial or sample? :S Would be really helpfull.
Thanks a lot!
Great!! Came in handy when i really needed it.
Thank you so much, I really needed this for a level editor function in a game I’m working on – and this allows me to create the levels in movieclips, and then read the contents of the movieclips, and place the contents on the stage (or any other container), effectively making the Flash Professional IDE a visual level editor!