2012-05-26 25 views
13

Nếu bạn làm console.log($('some selector')) trong trình duyệt, nó sẽ trả về những gì trông giống như một mảng (dòng đầu tiên):

picture from latest version of chrome web console on Github project page

Nhưng nhận thấy rằng nó không phải là một instanceof Array, nhưng nó thực sự the jQuery object.

Khi bạn thực hiện console.dir($('h1')), nó cho thấy nó thực sự là đối tượng jQuery.

Câu hỏi đặt ra là, làm thế nào để làm cho nó trông giống như đó là một mảng trong bảng điều khiển web? Tôi nhận thấy trong nguồn jQuery here họ thêm tham chiếu đến một vài phương pháp Array và Object, và here chúng thêm toArray (và slice và những thứ khác) vào đối tượng jQuery. Bảng điều khiển web có bằng cách nào đó kiểm tra các phương pháp này và nếu nó tìm thấy một phương thức (toArray, indexOf, slice, v.v.), nó có thể in nó dưới dạng một mảng không? Tôi muốn nhận hành vi này từ bất kỳ đối tượng tùy chỉnh nào, chẳng hạn như Ember.ArrayProxy. Hiện tại khi bạn đăng nhập Ember.ArrayProxy, nó hiển thị > Object hoặc bất cứ điều gì, nhưng nó sẽ là tốt đẹp để hiển thị nó như là một mảng.

Bất kỳ ý tưởng nào?

+0

Đó có phải là hình ảnh mã không? – jimw

+0

Có một hình ảnh –

+0

Liên quan: http://stackoverflow.com/questions/6599071/array-like-objects-in-javascript. – pimvdb

Trả lời

15

Bạn làm cho đối tượng của bạn kế thừa Array sử dụng nguyên mẫu, như vậy:

function SomeType() { 
    this.push(16); 
} 

SomeType.prototype = []; 
SomeType.prototype.constructor = SomeType; // Make sure there are no unexpected results 

console.log(new SomeType()); // Displays in console as [16] 

Và, tất nhiên, tất cả các đối tượng jQuery là trường hợp của jQuery chức năng/constructor, vì vậy đó là cách jQuery hiện nó. Như một phần thưởng, vì thừa kế, bạn nhận được tất cả các phương thức từ Array và lập chỉ mục đi kèm với nó!

+0

Tính năng này có hoạt động trên trình duyệt không? –

+0

@LancePollard: Có. – Ryan

+2

Rất tuyệt! Tôi cũng đã làm một số bài kiểm tra khác, và nếu bạn làm điều này: 'var x = {length: 0, splice: Array.prototype.splice}', sau đó 'x' sẽ trông giống như một mảng. Lạ ... Nó đòi hỏi cụ thể 2 thuộc tính đó. –

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