Подтвердить что ты не робот

Как записывается $('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 или что-то еще, но было бы неплохо показать его как массив.

Любые идеи?

4b9b3361

Ответ 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, а также индексирование, которое приходит с ним!