2012-04-27 19 views
5

Eche un vistazo al fragmento a continuación. ¿Hay alguna función que pueda escribir en reemplazo de ... para generar la ruta, que podría reutilizarse en otra función? Algo como var route = this.show.fullyQualifiedName quizás?JavaScript: ¿Obtener el nombre completo de la función desde dentro?

var services = { 
    'github.com': { 
     api: { 
      v2: { 
       json: { 
        repos: { 
         show: function(username, fn) { 
          var route = ...; 
          // route now == 'github.com/api/v2/json/repos/show' 

          route += '/' + username; 

          return $.getJSON('http://' + route).done(fn); 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+0

No creo que sea posible una búsqueda de arriba hacia abajo. ¿Cómo sabrá la búsqueda cuándo se encuentra su coincidencia a menos que le haya proporcionado la ruta completa de 'show'? Y si lo he proporcionado con la ruta completa de 'show', eso derrota el punto de uso de una sola función o obtener' valores de ruta 'dentro de cualquier método como 'show' que defino. – barfoo

+0

tendrías que llenar recursivamente el árbol (solo una vez) antes de llamar a la función. – Alnitak

Respuesta

3

No, no hay, al menos, no utilizando operaciones de estilo "reflejo".

Los objetos no tienen conocimiento del nombre de los objetos en los que están contenidos, sobre todo porque el mismo objeto (referencia) podría estar contenido en muchos objetos.

La única forma de hacerlo sería empezar por el objeto superior y su forma de trabajo hacia el interior, por ejemplo .:

function fillRoutes(obj) { 
    var route = obj._route || ''; 
    for (var key in obj) { 
     if (key === '_route') continue; 
     var next = obj[key]; 
     next._route = route + '/' + key; 
     fillRoutes(next); 
    } 
} 

que pondrá una nueva _route característica en cada objeto que contiene el camino de ese objeto.

Ver http://jsfiddle.net/alnitak/WbMfW/

1

No se puede hacer una búsqueda recursiva, como Alnitak dicho, pero se puede hacer una búsqueda de arriba hacia abajo, aunque podría ser un poco más lento dependiendo del tamaño de su objeto. Examinaría las propiedades del objeto y verificaría si tiene hijos. Si tiene un hijo, recorra eso, etc. Cuando llegue al final de una cadena y no haya encontrado su función, vaya al siguiente niño y continúe la búsqueda.

No tengo tiempo para escribir un ejemplo ahora, pero espero que puedas juntar algo de esto.

Cuestiones relacionadas