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', это победит точку использования одной функции o получите значения' route' из любого метода, например 'show', который я определяю. – barfoo

+0

вам придется рекурсивно заполнять дерево (только один раз) _before_, когда-либо вызывающее функцию. – Alnitak

ответ

3

Нет, по крайней мере, не используется операция «отражения».

Объекты не имеют сведений об именах объектов, в которых они содержатся, не в последнюю очередь потому, что один и тот же объект (ссылка) может содержаться в пределах много объектов.

Единственный способ вы могли бы сделать это было бы начать с верхнего объекта и работать ваш путь внутрь, например .:

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

который поставит новый _route свойство в каждом объекте, который содержит путь этого объекта.

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

1

Вы не можете сделать рекурсивный поиск, как Альнитака сказал, но вы могли бы сделать сверху вниз поиск, хотя это может быть несколько медленными в зависимости от размера объекта. Вы пройдете через свойства объекта, проверив, есть ли у него дети. Если у него есть ребенок, пропустите его и т. Д. Когда вы достигнете конца цепочки и вы не нашли свою функцию, перейдите к следующему ребенку и продолжите поиск.

Не успел написать пример сейчас, но, надеюсь, вы можете с ним что-то собрать.

Смежные вопросы