2009-07-30 2 views
3

Я пытаюсь выполнить итерацию через каждый из элементов объекта. Для каждого члена я проверяю, является ли это функцией или нет. Если это функция, я хочу получить ее имя и выполнить некоторую логику, основанную на имени функции. Я даже не знаю, возможно ли это. Это? Какие-нибудь советы?Actionscript 3 introspection - имена функций

пример:

var mems: Object = getMemberNames(obj, true); 

for each(mem: Object in members) { 
    if(!(mem is Function)) 
     continue; 

    var func: Function = Function(mem); 

    //I want something like this: 
    if(func.getName().startsWith("xxxx")) { 
     func.call(...); 
    } 

} 

Я с трудом находя много на этом. Спасибо за помощь.

ответ

4

Ваш псевдокод близок к тому, что вы хотите. Однако вместо использования getMemberNames, который может получить частные методы, вы можете перебрать элементы с помощью простого цикла for..in и получить значения элементов, используя скобки. Например:

public function callxxxxMethods(o:Object):void 
{ 
    for(var name:String in o) 
    { 
    if(!(o[name] is Function)) 
     continue; 
    if(name.startsWith("xxxx")) 
    { 
     o[name].call(...); 
    } 
    } 
} 
+1

Следует также избегать заливки объекта вы проверяете, как литье очень дорого, используя что-то вроде «есть» или «как», - как этот пример делает , гораздо лучше. – quoo

+0

Исправьте меня, если я ошибаюсь, но я не думаю, что вы можете использовать функцию. –

+0

@Tyler Egeto: Конечно, вы не можете сразу его называть, хотя я верю, что так: Функция (o [имя])(), вы должны ее сохранить: var foo: Function = Function (o [name]); Foo(); –

0

Ответ Дэна Монего на деньги, но работает только для динамических членов. Для любого фиксированного экземпляра (или статическими) членов, вам придется использовать flash.utils.describeType:

var description:XML = describeType(obj); 

/* By using E4X, we can use a sort of lamdba like statement to find the members 
* that match our criteria. In this case, we make sure the name starts with "xxx". 
*/ 
var methodNames:XMLList = description..method.(@name.substr(0, 3) == "xxx"); 

for each (var method:XML in methodNames) 
{ 
    var callback:Function = obj[[email protected]]; 
    callback(); // For calling with an unknown set of parameters, use callback.apply 
} 

Используйте это в сочетании с ответом Дэна, если у вас есть сочетание динамических и постоянных членов.

0

Я проделал определенную работу и объединил оба подхода. Имейте в виду, что он работает только для общедоступных участников - во всех остальных случаях возвращается null.

/** 
    * Returns the name of a function. The function must be <b>publicly</b> visible, 
    * otherwise nothing will be found and <code>null</code> returned.</br>Namespaces like 
    * <code>internal</code>, <code>protected</code>, <code>private</code>, etc. cannot 
    * be accessed by this method. 
    * 
    * @param f The function you want to get the name of. 
    * 
    * @return The name of the function or <code>null</code> if no match was found.</br> 
    *   In that case it is likely that the function is declared 
    *   in the <code>private</code> namespace. 
    **/ 
    public static function getFunctionName(f:Function):String 
    { 
     // get the object that contains the function (this of f) 
     var t:Object = getSavedThis(f); 

     // get all methods contained 
     var methods:XMLList = describeType(t)[email protected]; 

     for each (var m:String in methods) 
     { 
      // return the method name if the thisObject of f (t) 
      // has a property by that name 
      // that is not null (null = doesn't exist) and 
      // is strictly equal to the function we search the name of 
      if (t.hasOwnProperty(m) && t[m] != null && t[m] === f) return m;    
     } 
     // if we arrive here, we haven't found anything... 
     // maybe the function is declared in the private namespace? 
     return null;           
    } 

Greetz,

токсикодендрон

+1

Что такое getSavedThis (f)? –

Смежные вопросы