您可以使用constructor
屬性獲取實例自己的類的引用,但要訪問祖先類,必須使用describeType
和getDefinitionByName
。這些功能強大,但昂貴的 - 所以一定要確保你不要濫用這一點:
function callStaticAncestorProperty(instance:Object, staticProperty:String):* {
var type:XML = describeType(instance);
var ret:* = instance.constructor[staticProperty];
for each(var extend:XML in type.extendsClass)
ret = ret ? ret : getStaticPropertyOrUndefined(extend, staticProperty);
return ret;
}
function getStaticPropertyOrUndefined(extend:XML, staticProperty:String):* {
var clazz:Class = getDefinitionByName([email protected]().replace("::", ".")) as Class;
return clazz[staticProperty] ? clazz[staticProperty] : undefined;
}
這用來檢查類本身所具有的屬性,然後在每個超類型進行迭代。請注意,要返回的第一個值將被返回,即如果子類和超類都具有此屬性,則將返回子類的值。
編輯
我纔剛剛意識到你詢問的方法調用,而不是屬性。這工作幾乎相同的方式:
function callStaticAncestorMethod(instance:Object, staticMethod:String):void {
var type:XML = describeType(instance);
var method:Function = instance.constructor[staticMethod];
for each(var extend:XML in type.extendsClass)
method = method ? method : getStaticMethodOrUndefined(extend, staticMethod);
if (method) method();
}
function getStaticMethodOrUndefined(extend:XML, staticMethod:String):Function {
var clazz:Class = getDefinitionByName([email protected]().replace("::", ".")) as Class;
return clazz[staticMethod] ? clazz[staticMethod] : undefined;
}
祕密的握手了。呼叫() –