Pregunta

Estoy intentando iterar a través de cada uno de los miembros de un objeto. Para cada miembro, verifico si es una función o no. Si es una función, quiero obtener su nombre y realizar alguna lógica basada en el nombre de la función. Aunque no sé si esto es posible. ¿Lo es? ¿Algún consejo?

ejemplo:

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(...);
    }

}

Me cuesta mucho encontrar mucho al hacer esto. Gracias por la ayuda.

¿Fue útil?

Solución

Tu pseudocódigo está cerca de hacer lo que quieres. Sin embargo, en lugar de usar getMemberNames, que puede obtener métodos privados, puede hacer un bucle sobre los miembros con un simple for ... in loop, y obtener los valores de los miembros usando corchetes. Por ejemplo:

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(...);
    }
  }
}

Otros consejos

La respuesta de Dan Monego es sobre el dinero, pero solo funciona para miembros dinámicos. Para cualquier miembro de instancia fija (o estática), deberá usar 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[method.@name];
    callback(); // For calling with an unknown set of parameters, use callback.apply
}

Use esto junto con la respuesta de Dan si tiene una combinación de miembros dinámicos y fijos.

He hecho algunos trabajos y combiné ambos enfoques. Tenga en cuenta que funciona solo para miembros visibles públicamente, en todos los demás casos se devuelve 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)..method.@name;

        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,

tox

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top