2012-04-27 31 views
5

Hãy xem đoạn mã bên dưới. Có chức năng nào tôi có thể viết thay thế cho ... để tạo tuyến đường, có thể sử dụng lại trong một chức năng khác không? Một cái gì đó như var route = this.show.fullyQualifiedName có lẽ?JavaScript: Nhận tên hàm đủ điều kiện từ bên trong nó?

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

Tôi không nghĩ rằng tìm kiếm từ trên xuống có thể thực hiện được. Làm thế nào tìm kiếm sẽ biết khi nào nó được tìm thấy, trừ khi tôi đã cung cấp nó với đường dẫn đầy đủ của 'show'? Và nếu tôi đã cung cấp nó với đường dẫn đầy đủ của 'show', nó sẽ đánh bại điểm sử dụng một hàm duy nhất có được các giá trị' route' từ bên trong bất kỳ phương thức nào như 'show' mà tôi định nghĩa. – barfoo

+0

bạn phải đệ quy điền vào cây (chỉ một lần) _trước khi gọi hàm. – Alnitak

Trả lời

3

Không, không có, ít nhất không sử dụng các hoạt động kiểu "phản chiếu".

Đối tượng không biết tên của đối tượng mà chúng chứa trong đó, ít nhất vì cùng một đối tượng (tham chiếu) có thể được chứa trong một đối tượng nhiều đối tượng.

Cách duy nhất bạn có thể làm điều đó sẽ được bắt đầu từ các đối tượng hàng đầu và làm việc theo cách của bạn vào bên trong, ví dụ .:

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

mà sẽ đặt một tài sản _route mới trong mỗi đối tượng có chứa đường của đối tượng đó.

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

1

Bạn không thể thực hiện tìm kiếm đệ quy, như Alnitak nói, nhưng bạn có thể thực hiện tìm kiếm từ trên xuống, mặc dù nó có thể là một chút chậm tùy thuộc vào kích thước của đối tượng của bạn. Bạn sẽ lặp qua các thuộc tính của đối tượng, kiểm tra xem nó có con không. Nếu nó có con, lặp lại thông tin đó, v.v. Khi bạn đến cuối chuỗi và bạn không tìm thấy chức năng của mình, hãy chuyển sang đứa trẻ tiếp theo và tiếp tục tìm kiếm.

Không có thời gian để viết một ví dụ ngay bây giờ, nhưng hy vọng bạn có thể chia sẻ điều gì đó với nhau từ điều này.

Các vấn đề liên quan