4

これはjQueryオブジェクトを返します。jQueryオブジェクトとは何ですか。それはオブジェクトですか、配列ですか、それとも両方の組み合わせですか?

$("#id")

ここでソースを探していますが、見つかりません。

4

4 に答える 4

16

まず、そうではありません。

jQueryオブジェクトは配列ではありません。

JavaScriptには、組み込みのネイティブコンストラクター関数があります。これらの1つはですArray。しかし、最終的にArrayコンストラクターはオブジェクトを作成します。jQueryオブジェクトはArrayコンストラクターから構築されません。


では、オブジェクトは配列とどう違うのですか?

Objectおよびは組み込みのネイティブコンストラクターであるためArray、コンストラクターから作成されたオブジェクトには内部[[Class]]プロパティがあります。このようにその価値を見ることができます。

Object.prototype.toString.call({}); // [object Object]
Object.prototype.toString.call([]); // [object Array]

したがって、これらのオブジェクトには違いがあることがわかります。


他にどのような違いがありますか?

2つのオブジェクトのプロトタイプチェーンは異なります。プレーンオブジェクトの場合、次のように視覚化できます。

{} ---> Object.prototype ---> null

アレイの場合は、このようになります。

[] ---> Array.prototype ---> Object.prototype ---> null

したがって、それらの継承によってそれらも区別されることがわかります。


では、jQueryオブジェクトはどうですか?

jQueryオブジェクトは、配列というよりはプレーンオブジェクトに似ています。ただし、JavaScriptを使用すると、カスタム(組み込みではない)コンストラクターを定義できます。

値はtoStringObjectと同じになります[object Object]が、プロトタイプチェーンは異なります。

function Foo() {

}

new Foo() ---> Foo.prototype ---> Object.prototype ---> null

したがって、jQueryのプロトタイプチェーンはこれに似ていますが、のjQuery代わりにコンストラクターを使用しFooます。


では、これはどういう意味ですか?

JavaScriptのすべてのオブジェクトは、*から継承するという点で似ていますが、拡張されたプロトタイプチェーンを持つさまざまなオブジェクトを使用できます。また、それらを区別するObject.prototype内部プロパティを持つネイティブオブジェクトを使用することもできます。[[Class]]

したがって、「jQueryオブジェクトはどのタイプのオブジェクトであるか」という質問に答えるには、Object.prototypeすべてのオブジェクトと同様に継承するだけでなくprototype、カスタムコンストラクターからも継承するオブジェクトであるという答えが返されます。

* ES5では、プロトタイプチェーンを持たないオブジェクトを使用することもできます。そのチェーンはすぐに。で終了しnullます。


ただし、jQueryオブジェクトはDOM要素を数値インデックスに格納し、.lengthプロパティを持っています。それはそれを配列にしませんか?

いいえ、それは単にそれを数字であるプロパティとという名前のプロパティを持つオブジェクトにしますlength

var myObj = {};
myObj[0] = "foo";
myObj[1] = "bar";

配列のプロパティは特別ではありません。これらはオブジェクトのプロパティと同じです。

var myArr = [];
myArr[0] = "foo";
myArr[1] = "bar";

これらの2つのコード例は、まったく同じことを行っています。


彼らはまったく同じことをしていますか?本当に?

よくほとんど。プロパティ自体は、配列オブジェクトとオブジェクトオブジェクトの間で違いはありませんが、配列にはいくつかの特別な動作があります。

たとえば、経常.length収支よりも高いインデックスでプロパティを追加すると、.lengthは自動的に調整されます。

myArr.length; // 2
myArr[9] = "baz";
myArr.length; // 10

アレイでは、それ自体にいくつかの「魔法の」機能があります。たとえば、低い値に.length設定することでアレイを切り捨てることができます。.length

myArr.length = 1;
myArr[1]; // undefined

したがって、jQueryオブジェクトには数値プロパティと.lengthプロパティがありますが、ネイティブ配列のようには動作しません。

于 2012-09-24T18:39:24.400 に答える
12

$()jQueryクラスのインスタンスを返します(new jQuery())。
したがって、すべての標準jQueryメソッドとすべてのプラグインをjQuery.prototype(にエイリアスされたjQuery.fn)から継承します。

さらに、jQuery()コンストラクターは、プロパティと、セット内の各要素のインデックス付きプロパティを追加することにより、各インスタンスを配列のようなオブジェクトに変換します。length

于 2012-09-24T18:26:12.520 に答える
4

返されるオブジェクト(その意味についてはEcmaScript§4.2.1を参照)は、プロトタイプオブジェクトから継承したjQueryの内部コンストラクター関数( -jQueryのインスタンス化パターンの詳細についてはこの回答jQuery.fn.initを参照)のインスタンスです。$.fn

そしてもちろん、これはObjectJavaScriptのほぼすべてのオブジェクトのインスタンスです。

Arrayまた、すべてのjQuery要素は[DOM]要素のコレクションを表すため、数値インデックスプロパティを持つように見えます。lengthプロパティは自動的に自己更新されませんが、ほとんどのArrayメソッドを適用できます。これは実際のArrayインスタンスではありません(配列は何ですか、JSには何がありますか?)。

于 2012-09-24T18:27:11.837 に答える
2

jqueryオブジェクトはjqueryライブラリのオブジェクトです。基本的に、すべてのjqueryメソッドとプロパティはそのjqueryオブジェクトにアタッチされており、通常のjavascriptオブジェクトとして使用することはできません。また、どのjqueryオブジェクトからも異なります。

于 2012-09-24T18:26:48.693 に答える