describeType()
очень медленно, с вычислительной точки зрения. Если вам необходимо определить цепочку наследования неинтересных классов, рассмотрите возможность использования Class.prototype
и prototype.isPrototypeOf()
. Это позволяет проверять наследование и равенство, если все, что у вас есть, это сами классы (в отличие от объекта, который является экземпляром этого класса).
Если у вас есть только строковое представление имени класса (в отличие от самого класса), вам необходимо сначала преобразовать его в соответствующий класс, используя flash.utils.getDefinitionByName()
, предполагая, что вы хотя бы объявили класс где-то в вашем коде , Если класс существует только в загруженной библиотеке SWF, вам, возможно, придется использовать что-то вроде ApplicationDomain.currentDomain.getDefinitionByName()
или contextLoader.currentDomain.getDefinitionByName()
.
Вот рабочий пример, который принимает имена классов или строк и проверяет, находится ли первая в цепочке наследования второй.Дополнительный аргумент позволяет вам решить, хотите ли вы возвращать значение false, если два класса идентичны, а не первый, расширяющий второй.
/**
* 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;
}
Отлично, спасибо. Исходя из богатого API Java 6, мне приходится постоянно изобретать колесо с помощью Flash/Flex, grrr ;-). – jmdecombe
Это хорошо, но относительно медленно. Если вы просто делаете это время от времени, вы в порядке. В противном случае рассмотрим 'isPrototypeOf()'. –