32

jQuery が配列のようなオブジェクトをどのように構築するのか疑問に思っています。私が解決しようとしている重要なことは、コンソールにそれを配列として解釈させ、そのように表示させる方法です。長さのプロパティと関係があることは知っていますが、少し遊んだ後ではよくわかりません。

以下の例のように、通常の配列のようなオブジェクトよりも技術的な利点がないことはわかっています。しかし、ユーザーがテストやデバッグを行う場合、これは重要なセマンティック要素だと思います。

オブジェクトのような通常の配列。

function foo(){
    // Array like objects have a length property and it's 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 オブジェクトの proto は、予想されるように 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 が原型を Object[0] に設定した方法はわかりませんが、答えはそこのどこかにあると思います。誰でもアイデアはありますか?

4

2 に答える 2

43

オブジェクトにはlength、およびsplice

> var x = {length:2, '0':'foo', '1':'bar', splice:function(){}}
> console.log(x);
['foo', 'bar']

参考までにObject[0]、プロトタイプはまったく同じ理由です。ブラウザーは、プロトタイプ自体を配列として認識しています。理由は次のとおりです。

$.prototype.length == 0;
$.prototype.splice == [].splice;
于 2011-07-06T15:59:03.377 に答える