describeType()
es muy lento para hablar, computacionalmente. Si necesita determinar la cadena de herencia de las clases desinstaladas, considere usar Class.prototype
y prototype.isPrototypeOf()
. Esto le permite verificar la herencia y la igualdad si todo lo que tiene son las propias Clases (a diferencia de un objeto que es una instancia de esa Clase).
Si solo tiene una representación en cadena del nombre de la clase (a diferencia de la propia Clase), debe convertirla en una Clase adecuada primero, utilizando flash.utils.getDefinitionByName()
suponiendo que al menos ha declarado la clase en algún lugar de su código . Si la clase solo existe en alguna parte de una Biblioteca SWF cargada, es posible que deba usar algo como ApplicationDomain.currentDomain.getDefinitionByName()
o contextLoader.currentDomain.getDefinitionByName()
.
Aquí hay un ejemplo de trabajo que acepta Classes o String class names y verifica si el primero pertenece a la cadena de herencia del segundo.El argumento adicional le permite decidir si desea devolver falso si las dos clases son idénticas en lugar de la primera extendiendo la segunda.
/**
* Determines whether the childClass is in the inheritance chain of the parentClass. Both classes must be declared
* within the current ApplicationDomain for this to work.
*
* @param childClass
* @param parentClass
* @param mustBeChild
*/
public static function inheritsFrom(childClass:*, parentClass:*, mustBeChild:Boolean = false) {
var child:Class,
parent:Class;
if (childClass is Class) {
child = childClass;
} else if (childClass is String){
child = getDefinitionByName(childClass) as Class;
}
if (! child) {
throw new ArgumentError("childClass must be a valid class name or a Class");
}
if (parentClass is Class) {
parent = parentClass;
} else if (parentClass is String){
parent = getDefinitionByName(parentClass) as Class;
}
if (! parent) {
throw new ArgumentError("parentClass must be a valid class name or a Class");
}
if (parent.prototype.isPrototypeOf(child.prototype)) {
return true;
} else {
if (mustBeChild) {
return false;
} else {
if (parent.prototype === child.prototype) {
return true;
}
}
}
return false;
}
Genial, gracias. Viniendo de la rica API Java 6, me encuentro reinventando la rueda todo el tiempo con Flash/Flex, grrr ;-). – jmdecombe
Esto es bueno pero relativamente lento. Si solo haces esto de vez en cuando, estás bien. De lo contrario, considere 'isPrototypeOf()'. –