Что делает объект jQuery отображаться как массив в инструментах разработчика Chrome?
Мне интересно, как возможно, что объекты 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, что делает инструменты разработчика обрабатывать его как массив при отображении экземпляра?
Ответы
Ответ 1
От http://api.jquery.com/jQuery.makeArray/:
Многие методы, как в jQuery, так и в JavaScript в целом, возвращают объекты, похожие на массивы. Например, функция jQuery factory $() возвращает объект jQuery, который обладает многими свойствами массива (длина, оператор доступа к массиву [] и т.д.), Но не является точно таким же, как массив и не хватает некоторых встроенных методов массива (таких как .pop() и .reverse()).
В принципе, объект должен иметь свойства length
и splice
, которые должны быть похожими на массив. Вот соответствующий вопрос SO: Array Like Objects в Javascript
Ответ 2
Вы, вероятно, знаете это, но console.log
не отображает переданный контент "как есть", он пытается быть "умным" и выполняет некоторую пост-обработку. Если вы хотите увидеть исходный объект "как есть", существует метод console.dir
.