この質問に答える前に、 $(...) が配列のようなプロパティを持つ特別なオブジェクトを返すことを理解する必要があります。ドキュメントから:
jQuery ファクトリ関数 $() は、配列の多くのプロパティ (長さ、[] 配列アクセス演算子など) を持つ jQuery オブジェクトを返しますが、配列とまったく同じではなく、配列の構築の一部が欠けています。 -in メソッド (.pop() や .reverse() など)。
それで、これが起こることです。
セレクターのタイプに関係なく、new jQuery.fn.init( selector, context, rootjQuery );
が呼び出されるため、新しいオブジェクトが作成され、そのプロパティがこのinit()
コンストラクターに設定されます。
$(...) の引数は、空、DOMElement、文字列、または関数 (isFunction 経由) のチェックを受けます
すべてのチェックが失敗し、最終的に次のコードが呼び出されます。
if (selector.selector !== undefined ) {
this.selector = selector.selector;
this.context = selector.context;
}
return jQuery.makeArray( selector, this );
関数 makeArray() は、提供されたセレクターを配列のようなオブジェクトに変換します。this.length
プロパティを設定するだけthis.ret[0]=..., this.ret[1]=...
で、jQuery プロトタイプ (別名 ) に基づくオブジェクトのままで、配列のように「感じる」ことができます$.fn
。上記のコードは、プロトタイプにthis
含まれるまったく新しいオブジェクトであることを思い出してください。$.fn
さらに、.selector
プロパティ.context
はオリジナルからこれにコピーされます。
たとえば、.prevObject
プロパティは失われますが、メソッドの連鎖によっては新しいプロパティが追加される可能性があることに注意してください。
全体として、時間とメモリが必要であり.selector
、誰かがプラグインに jQuery オブジェクトを渡すタイミングを単純にチェックすることはおそらく理にかなっています。反対に、元のインスタンスと同じ動作をする新しいインスタンスが役立つ場合があります。