これはjQueryオブジェクトを返します。jQueryオブジェクトとは何ですか。それはオブジェクトですか、配列ですか、それとも両方の組み合わせですか?
$("#id")
ここでソースを探していますが、見つかりません。
これはjQueryオブジェクトを返します。jQueryオブジェクトとは何ですか。それはオブジェクトですか、配列ですか、それとも両方の組み合わせですか?
$("#id")
ここでソースを探していますが、見つかりません。
まず、そうではありません。
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を使用すると、カスタム(組み込みではない)コンストラクターを定義できます。
値はtoString
Objectと同じになります[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
プロパティがありますが、ネイティブ配列のようには動作しません。
$()
jQueryクラスのインスタンスを返します(new jQuery()
)。
したがって、すべての標準jQueryメソッドとすべてのプラグインをjQuery.prototype
(にエイリアスされたjQuery.fn
)から継承します。
さらに、jQuery()
コンストラクターは、プロパティと、セット内の各要素のインデックス付きプロパティを追加することにより、各インスタンスを配列のようなオブジェクトに変換します。length
返されるオブジェクト(その意味についてはEcmaScript§4.2.1を参照)は、プロトタイプオブジェクトから継承したjQueryの内部コンストラクター関数( -jQueryのインスタンス化パターンの詳細についてはこの回答jQuery.fn.init
を参照)のインスタンスです。$.fn
そしてもちろん、これはObject
JavaScriptのほぼすべてのオブジェクトのインスタンスです。
Array
また、すべてのjQuery要素は[DOM]要素のコレクションを表すため、数値インデックスプロパティを持つように見えます。length
プロパティは自動的に自己更新されませんが、ほとんどのArrayメソッドを適用できます。これは実際のArray
インスタンスではありません(配列とは何ですか、JSには何がありますか?)。
jqueryオブジェクトはjqueryライブラリのオブジェクトです。基本的に、すべてのjqueryメソッドとプロパティはそのjqueryオブジェクトにアタッチされており、通常のjavascriptオブジェクトとして使用することはできません。また、どのjqueryオブジェクトからも異なります。