2012-04-27 11 views
5

Werfen Sie einen Blick auf den Ausschnitt unten. Gibt es irgendeine Funktion, die ich anstelle von ... schreiben könnte, um die Route zu generieren, die in einer anderen Funktion wiederverwendet werden könnte? Etwas wie var route = this.show.fullyQualifiedName vielleicht?JavaScript: Abrufen des vollqualifizierten Funktionsnamens von ihm?

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

Ich glaube nicht, dass eine Top-Down-Suche möglich ist. Wie wird die Suche wissen, wenn die Übereinstimmung gefunden wird, wenn ich sie nicht mit dem vollständigen Pfad von 'show' versehen habe? Und wenn ich es mit dem vollständigen Pfad von 'show' versehen habe, wird der Verwendungsort mit einer einzigen Funktion besiegt, um' route' Werte aus einer beliebigen Methode wie 'show' zu erhalten, die ich definiere. – barfoo

+0

müssten Sie den Baum rekursiv füllen (nur einmal) vor Aufruf der Funktion. – Alnitak

Antwort

3

Nein, gibt es nicht, zumindest nicht mit "Reflexion" Stil Operationen.

Objekte haben keine Kenntnis über den Namen der Objekte, in denen sie enthalten sind, nicht zuletzt, weil das gleiche Objekt (Referenz) in viele Objekte enthalten sein könnte.

Die einzige Möglichkeit, es tun könnte, würde an der Spitze Objekt, um zu starten und arbeiten Sie sich nach innen, z.B .:

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

, die eine neue _route Eigenschaft in jedem Objekt gesetzt wird, dass dieses Objekts Pfad enthält.

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

1

Sie nicht eine rekursive Suche machen kann, wie Alnitak sagte, aber man konnte eine Top-Down-Suche, obwohl sie in Abhängigkeit von der Größe des Objekts etwas langsam sein könnte. Sie würden die Eigenschaften des Objekts durchlaufen und prüfen, ob untergeordnete Objekte vorhanden sind. Wenn es ein Kind hat, durchlaufen Sie es, usw. Wenn Sie das Ende einer Kette erreichen und Ihre Funktion nicht gefunden haben, gehen Sie zum nächsten Kind und setzen Sie die Suche fort.

Hab jetzt nicht die Zeit ein Beispiel zu schreiben, aber hoffentlich kannst du etwas daraus zusammensetzen.

Verwandte Themen