Что заставляет объект jQuery отображаться как массив в Инструментах разработчика Chrome? - PullRequest
10 голосов
/ 31 августа 2011

Мне интересно, как это возможно, что объекты jQuery отображаются в виде массива в журнале консоли инструментов разработчика в Chrome.

например. если я выполню $('<a>'), то, что я вижу в журнале консоли:

[<a>​</a>​]

Но следующие утверждения являются ложными:

var a = $("<a>");

Array.isArray(a);   // false
a instanceof Array; // false

Я попытался изменить jQuery и посмотреть, что произойдет, и одна удивительная вещь состоит в том, что удаление length из функции jQuery удаляет запись массива:

length: 0, // commenting this line removes array notation

Вместо этого он затем отображается как (стрелка является сплошной для расширения):

> jQuery.jQuery.fn.jQuery.init

Но если я попытаюсь создать свой собственный конструктор, который должен отображаться в записи массива, он не будет работать:

var test = function() { this.length = 0 };

new test();

// Logged (arrow is same one as before):
// > test

Так что мне интересно, что в коде jQuery позволяет инструментам разработчика показывать экземпляры в виде массива. Какое свойство / функция / вещь добавляется в jQuery, что позволяет инструментам разработчика обрабатывать его как массив при отображении экземпляра?

Ответы [ 2 ]

11 голосов
/ 31 августа 2011

С http://api.jquery.com/jQuery.makeArray/:

Многие методы, как в jQuery, так и в целом в JavaScript, возвращают объекты, похожие на массивы.Например, функция фабрики jQuery $ () возвращает объект jQuery, который имеет многие свойства массива (длина, оператор доступа к массиву [] и т. Д.), Но не совсем совпадает с массивом и не имеет некоторыхвстроенных методов массива (таких как .pop () и .reverse ()).

По существу, объект должен иметь свойства length и splice, чтобы быть похожим на массив,Вот соответствующий вопрос SO: Объекты, подобные массиву в Javascript

4 голосов
/ 31 августа 2011

Вы, вероятно, знаете это, но console.log не отображает переданный контент "как есть", он пытается быть "умным" и выполняет некоторую постобработку.Если вы хотите увидеть оригинальный объект "как есть", есть метод console.dir.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...