2012-04-27 2 views
5

아래 스 니펫을 살펴보십시오. ...을 대체 할 수있는 함수가 있습니까? 다른 함수에서 재사용 할 수 있습니까? 아마도 var route = this.show.fullyQualifiedName 같은 것이 있을까요?JavaScript : 정규화 된 함수 이름을 가져 오는 중입니까?

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

하향식 검색이 가능하지 않다고 생각합니다. 'show'의 전체 경로를 제공하지 않으면 검색 결과가 어울리는지 어떻게 알 수 있습니까? 그리고'show '의 전체 경로를 제공했다면, 그것은 내가 정의한'show'와 같은 메소드 내부에서'route' 값을 얻는 단일 기능의 사용 포인트를 무효화합니다. – barfoo

+0

함수를 호출하기 전에 재귀 적으로 트리를 채워야합니다 (한 번만). – Alnitak

답변

3

아니요, 적어도 "리플렉션"스타일 작업은 사용하지 않습니다.

개체에는 포함 된 개체의 이름을 알지 못합니다. 적어도 동일한 개체 (참조)가 개 개체 내에 포함될 수 있기 때문입니다. 당신이 그것을 할 수

수있는 유일한 방법은 : 해당 개체의 경로가 포함 된 각 개체에 새로운 _route 속성을 넣어 것입니다

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

을 예컨대을 정상 개체에서 시작하여 안쪽으로 당신의 방법을 작동하는 것입니다.

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

1

당신은 말했다 알니 타크 같은 재귀 검색을 수행 할 수없는 경우를 참조하지만 개체의 크기에 따라 다소 느릴 수 있지만 당신은, 위에서 아래로 검색을 수행 할 수 있습니다. 객체의 프로퍼티를 순환하여 자식이 있는지 확인합니다. 아이가 있다면 그 아이를 통해 루프를 돌리십시오. 체인이 끝났을 때 기능을 찾지 못하면 다음 아이로 이동하여 검색을 계속하십시오.

지금 예를 쓸 시간이 없지만이 문제를 함께 해결할 수 있기를 바랍니다.

관련 문제