describeType()
在計算上是非常慢的。如果您需要確定未經證實的類的繼承鏈,請考慮使用Class.prototype
和prototype.isPrototypeOf()
。這允許您檢查繼承和相等性,如果您擁有的只是Classes本身(而不是作爲該Class實例的對象)。
如果您只有類名稱的字符串表示形式(與類本身相反),則必須先將其轉換爲適當的類,並使用flash.utils.getDefinitionByName()
,假設您至少在代碼中聲明瞭該類。如果該類僅存在於加載的SWF庫中的某處,則可能必須使用類似ApplicationDomain.currentDomain.getDefinitionByName()
或contextLoader.currentDomain.getDefinitionByName()
之類的內容。
下面是一個工作示例,它接受Classes或String類名,並檢查第一個是否在第二個繼承鏈中。額外的參數允許您決定如果兩個類是相同的而不是第一個擴展第二個類,那麼是否要返回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;
}
太好了,謝謝。來自豐富的Java 6 API,我發現自己必須隨時使用Flash/Flex,grrr ;-)重新發明輪子。 – jmdecombe 2009-11-10 15:38:24
這很好,但相對較慢。如果你偶爾會這樣做,那就沒問題。否則,請考慮'isPrototypeOf()'。 – 2014-08-13 16:58:34