Как записывается $('h1') в веб-консоль в виде массива в jQuery?
Если вы выполняете console.log($('some selector'))
в браузере, он возвращает то, что выглядит как массив (первая строка):
![picture from latest version of chrome web console on Github project page]()
Но обратите внимание, что это не instanceof Array
, но на самом деле объект jQuery
.
Когда вы выполняете console.dir($('h1'))
, он показывает, что это фактически объект jQuery.
Вопрос в том, как они делают его похожим на массив в веб-консоли? Я заметил в источнике jQuery здесь они добавляют ссылку на несколько методов массива и объекта и здесь они добавляют toArray
(и срез и другие) к объекту jQuery
. Является ли веб-консоль каким-то образом проверять эти методы, и если он находит один (toArray
, indexOf
, slice
и т.д.), Он печатает его как массив? Я хотел бы получить это поведение из любого пользовательского объекта, такого как Ember.ArrayProxy
. В настоящее время, когда вы регистрируете Ember.ArrayProxy
, он показывает > Object
или что-то еще, но было бы неплохо показать его как массив.
Любые идеи?
Ответы
Ответ 1
Вы делаете свой объект наследованием Array
с использованием прототипа, например:
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]
И, конечно, все объекты jQuery являются экземплярами конструктора jQuery
/конструктора, так что как это делает jQuery. В качестве бонуса из-за наследования вы получаете все методы из Array
, а также индексирование, которое приходит с ним!