Мне интересно, как jQuery создает свой объект, похожий на массив. Главное, что я пытаюсь решить, - это то, как ему удается заставить консоль интерпретировать его как массив и отображать его как таковой. Я знаю, что это имеет какое-то отношение к свойству length, но, немного поиграв, я не могу это понять.
Я знаю, что это не имеет технического преимущества над обычным массивом вроде объекта, как в приведенном ниже примере. Но я думаю, что это важный семантический элемент, когда пользователи тестируют и отлаживают.
Обычный массив, такой как Object.
function foo(){
// Array like objects have a length property and it properties use integer
// based sequential key names, e.g. 0,1,2,3,4,5,6 just like an array.
this.length = 1;
this[0] = 'hello'
}
// Just to make sure add the length property to the prototype to match the Array
// prototype
foo.prototype.length = 0;
// Give the Array like object an Array method to test that it works
foo.prototype.push = Array.prototype.push
// Create an Array like object
var bar = new foo;
//test it
bar.push('world');
console.log(bar);
// outputs
{ 0: 'hello',
1: 'world',
length: 2,
__proto__: foo
}
Где jQuery будет выводить
var jQArray = $('div')
console.log(jQArray);
// outputs
[<div></div>,<div></div>,<div></div>,<div></div>]
Если вы запустите
console.dir(jQArray)
// Outputs
{ 0: HTMLDivElement,
1: HTMLDivElement,
2: HTMLDivElement,
3: HTMLDivElement,
4: HTMLDivElement,
context: HTMLDocument,
length: 5,
__proto__: Object[0]
}
Прото-объект jQuery особенно интересен, поскольку его объект, а не jQuery.fn.init, как и следовало ожидать, также указывает [0], поскольку это то, что вы получаете, когда вы.
console.dir([])
// outputs Array[0] as the object name or Array[x] x being the internal length of the
// Array
Я понятия не имею, как jQuery установил его proto как Object [0], но я предполагаю, что ответ лежит где-то там. У кого-нибудь есть идеи?