Simon_Weaver
Simon_Weaver

Reputation: 145970

How to check if two objects are of the same type in Actionscript?

I want to do this in Actionscript:

typeof(control1) != typeof(control2)

to test if two objects are of the same type. This would work just fine in C#, but in Actionscript it doesnt. In fact it returns 'object' for both typeof() expressions because thats the way Actionscript works.

I couldn't seem to find an alternative by looking in the debugger, or on pages that describe typeof() in Actionscript.

Is there a way to get the actual runtime type?

Upvotes: 22

Views: 19831

Answers (7)

Is there a way to get the actual runtime type?

Yes.

var actualRuntimeType:Class = Object(yourInstance).constructor;

Some other answers already refer to .constructor, but you can't always directly access .constructor in ActionScript 3. It is only accessible on dynamic classes, which most classes are not. Attempting to use it on a regular class will cause a compile-time error under the default settings.

However, because every class inherits from Object, which is dynamic, we can look up their .constructor property just by casting an instance to Object.

Therefore if we are not interested in subclasses, we can confirm that two instances are of exactly the same class by simply evaluating this:

Object(instanceA).constructor === Object(instanceB).constructor;

I learned of this from the post "Get the class used to create an object instance in AS3" by Josh Tynjala.


A even simpler alternative that also works for me is just:

var actualRuntimeType:Class = yourInstance["constructor"];

The runtime is entirely capable of giving you the .constructor, it's just that the compiler complains if you use that syntax. Using ["constructor"] should produce the same bytecode, but the compiler isn't clever enough to stop you.

I included this second because it hasn't been tested anywhere except my current Flash environment, whereas several users have said that the method described above works for them.

Upvotes: 4

Marcus Blankenship
Marcus Blankenship

Reputation:

The best way is to use flash.utils.getQualifiedClassName(). Additionally, you can use flash.utils.describeType() to get an XML document the describes more about the class.

Upvotes: 19

Dhaval Patel
Dhaval Patel

Reputation:

Object obj = new Object();
Object o = new Object();

if(o.getClass().getName().endsWith(obj.getClass().getName())){
    return true;    
}else{
        return false;
}

Upvotes: 0

verveguy
verveguy

Reputation: 2148

More generally, if you want to test whether objectA is a subtype of objectB

import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;

...

if (objectA is getDefinitionByName(getQualifiedClassName(objectB)))
{
    ...
}

Upvotes: 0

Wes
Wes

Reputation:

Actionscript 3 has an is operator which can be used to compare objects. Consider the following code:

var mySprite:Sprite = new Sprite();
var myMovie:MovieClip = new MovieClip();

trace(mySprite is Sprite);
trace(myMovie is MovieClip);
trace(mySprite is MovieClip);
trace(myMovie is Sprite);

Which will produce the following output:

true
true
false
false

This will work for built-in classes, and classes you create yourself. The actionscript 2 equivalent of the is operator is instanceof.

Upvotes: 17

Richard Szalay
Richard Szalay

Reputation: 84744

If you want to account for inheritance, then you might want to try something like this:

if (objectA is objectB.constructor || objectB is objectA.constructor)
{
    // ObjectA inherits from ObjectB or vice versa
}

Upvotes: 1

enobrev
enobrev

Reputation: 22532

You'll want to use the Object.prototype.constructor.

From the documentation:

 dynamic class A {}
  trace(A.prototype.constructor);      // [class A]
  trace(A.prototype.constructor == A); // true
  var myA:A = new A();
  trace(myA.constructor == A);         // true

(Conveniently, this is also how to check types in javascript, which is what originally led me to this in the docs)

So, to test this out before I posted here, I tried it in an app I have, in a class called Player. Since the prototype property is static, you can't call it using "this" but you can just skip the scope identifier and it works:

public function checkType():void {
    trace(prototype.constructor, prototype.constructor == Player);
    // shows [class Player] true
}

Upvotes: 4

Related Questions