para - comandos de actionscript
¿Cómo verificar si dos objetos son del mismo tipo en Actionscript? (7)
Quiero hacer esto en Actionscript:
typeof(control1) != typeof(control2)
para probar si dos objetos son del mismo tipo. Esto funcionaría perfectamente en C #, pero en Actionscript no funciona. De hecho, devuelve ''object''
para ambas expresiones typeof()
porque esa es la forma en que funciona Actionscript.
Parece que no puedo encontrar una alternativa buscando en el depurador, o en las páginas que describen typeof()
en Actionscript.
¿Hay alguna manera de obtener el tipo de tiempo de ejecución real?
Querrá usar Object.prototype.constructor.
De la documentación :
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
(Convenientemente, esta es también la forma de verificar los tipos en javascript, que es lo que originalmente me llevó a esto en los documentos)
Entonces, para probar esto antes de publicar aquí, lo probé en una aplicación que tengo, en una clase llamada Player. Como la propiedad del prototipo es estática, no puede llamarla usando "this", pero puede omitir el identificador del alcance y funciona:
public function checkType():void {
trace(prototype.constructor, prototype.constructor == Player);
// shows [class Player] true
}
Si desea contabilizar la herencia, entonces puede intentar algo como esto:
if (objectA is objectB.constructor || objectB is objectA.constructor)
{
// ObjectA inherits from ObjectB or vice versa
}
Actionscript 3 tiene un operador is que se puede usar para comparar objetos. Considera el siguiente código:
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);
Que producirá el siguiente resultado:
true
true
false
false
Esto funcionará para las clases incorporadas, y las clases que cree usted mismo. El actionscript 2 equivalente del operador is es instanceof .
De manera más general, si desea probar si objectA es un subtipo de objectB
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;
...
if (objectA is getDefinitionByName(getQualifiedClassName(objectB)))
{
...
}
La mejor forma es usar flash.utils.getQualifiedClassName()
. Además, puede usar flash.utils.describeType()
para obtener un documento XML que describa más acerca de la clase.
Object obj = new Object();
Object o = new Object();
if(o.getClass().getName().endsWith(obj.getClass().getName())){
return true;
}else{
return false;
}
¿Hay alguna manera de obtener el tipo de tiempo de ejecución real?
Sí.
var actualRuntimeType:Class = Object(yourInstance).constructor;
Algunas otras respuestas ya se refieren a .constructor
, pero no siempre se puede acceder directamente a .constructor
en ActionScript 3. Solo se puede acceder a ellas en clases dynamic
, que la mayoría de las clases no lo hacen. Intentar utilizarlo en una clase regular causará un error en tiempo de compilación en la configuración predeterminada.
Sin embargo, debido a que cada clase hereda de Object
, que es dynamic
, podemos buscar su propiedad .constructor
simplemente lanzando una instancia a Object
.
Por lo tanto, si no estamos interesados en las subclases, podemos confirmar que dos instancias son exactamente de la misma clase simplemente evaluando esto:
Object(instanceA).constructor === Object(instanceB).constructor;
Me enteré de esto desde el post " Obtener la clase utilizada para crear una instancia de objeto en AS3 " por Josh Tynjala.
Una alternativa aún más simple que también funciona para mí es simplemente:
var actualRuntimeType:Class = yourInstance["constructor"];
El tiempo de ejecución es totalmente capaz de proporcionarle el .constructor
, es solo que el compilador se queja si usa esa sintaxis. El uso de ["constructor"]
debería producir el mismo bytecode, pero el compilador no es lo suficientemente inteligente como para detenerte.
Incluí este segundo porque no se ha probado en ningún lugar, excepto en mi entorno Flash actual, mientras que varios usuarios han dicho que el método descrito anteriormente funciona para ellos.