2012-04-27 14 views
5

Spójrz na poniższy fragment. Czy istnieje jakaś funkcja, którą mógłbym zastąpić ..., aby wygenerować trasę, która mogłaby zostać ponownie wykorzystana w innej funkcji? Coś jak może var route = this.show.fullyQualifiedName?JavaScript: Jak uzyskać w pełni kwalifikowaną nazwę funkcji?

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

Nie sądzę, że wyszukiwanie z góry jest możliwe. W jaki sposób wyszukiwanie dowie się, kiedy zostanie znalezione dopasowanie, chyba że udostępniłem mu pełną ścieżkę programu 'show'? A jeśli dostarczyłem mu pełną ścieżkę 'show', to pokonuje punkt użycia jednej funkcji o uzyskanie wartości' route' z jakiejkolwiek metody, jak zdefiniowałem 'show'. – barfoo

+0

trzeba rekurencyjnie wypełnić drzewo (tylko raz) _przedtem_ wywołanie funkcji. – Alnitak

Odpowiedz

3

Nie, nie ma, przynajmniej nie przy użyciu "Reflection" Operacje stylu.

Obiekty nie mają informacji o nazwie obiektów, w których się znajdują, między innymi dlatego, że ten sam obiekt (odniesienie) może być zawarty w obiektach wielu.

Jedynym sposobem można zrobić to byłoby zacząć od górnego obiektu i swój sposób pracy do wewnątrz, np .:

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

który położy nowy _route nieruchomość w każdym obiekcie, który zawiera ścieżkę, która obiektu.

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

1

Nie można zrobić rekurencyjne przeszukiwanie, jak Alnitak powiedział, ale można zrobić odgórnego przeszukiwanie, choć może być nieco powolna w zależności od wielkości obiektu. Przeszukałbyś właściwości obiektu, sprawdzając, czy ma dzieci. Jeśli ma dziecko, zapętlić je, itp. Kiedy dojdziesz do końca łańcucha i nie znalazłeś swojej funkcji, przejdź do następnego dziecka i kontynuuj poszukiwanie.

Nie mam czasu, aby napisać przykład teraz, ale mam nadzieję, że możesz złożyć coś z tego.

Powiązane problemy