web-dev-qa-db-ja.com

jQueryのjQuery.fn.initの理解に役立つ

JQueryを調べて、その仕組みをよりよく理解していました。コンストラクターは基本的に

_new jQuery.fn.init
_

JQueryのプロトタイプ内にinitを置くことのポイントは何だろうと思っていましたか? init()をjQueryオブジェクト自体の一部として定義しても、同じ目的を果たしませんか?


基本的に、jQueryのinit関数がjQuery.fn.init()ではなくjQuery.init()にある理由を知りたい

これをしている人はいますか:

_jQuery('a').eq(0).hide().init('div').slideToggle(); //?
_
43
Moshe K.

編集:読み直したとき、これはあなたの質問に答えるとは思わないが、jQueryがどのように機能するかを誰かがよく理解するのに役立つかもしれないので、それを辞める。


起こっているのは、jQuery()jQuery.fn.init()として定義されているということです。これは、セレクタ関数であるjQuery.prototype.init()を別の言い方です!これは、jQuery.fn.init() IS jQuery.init()!]であるため、誰もjQuery()または.init()を呼び出さないことを意味します。

何?

あなたが話しているコードを見てみましょう:

// Define a local copy of jQuery
var jQuery = function( selector, context ) {
        // The jQuery object is actually just the init constructor 'enhanced'
        return new jQuery.fn.init( selector, context );
    },

コメントでは、私が言ったことだけを言っていますが、もっと簡潔に。ただし、これは単なるjQueryのローカルコピーです...ただし、自己実行関数の最後にある908行(バージョン1.4.4)に移動すると、次のように表示されます。

// Expose jQuery to the global object
return (window.jQuery = window.$ = jQuery);

})();

...これは、このローカルjQueryがグローバルjQueryになることを意味します。そう?それで...このローカルjQueryは実際にはjQuery.fn.init()でしたか? init()とは何ですか? 100行目から208行目を見ると、それがセレクターメソッドであることがわかります。セレクターメソッドとは何ですか?タグ、ID、クラスを見つけるために常に使用するメソッドです... $('#id')jQuery('.class')$('ul li a')...セレクター関数!

したがって、jQuery.init('div')は、割り当て後のjQuery('div')の冗長バージョンであるため、だれも呼び出しません。 jQuery.fnjQuery.prototypeと言っているのとまったく同じであるため、実際にその部分が行うことは、jQueryオブジェクトのプロトタイプのメソッドとして.init()を割り当てることだけです。 I.E. jQueryプラグイン。

うわー、それは一口だった。私はこれが理にかなっていることを望み、この長い説明の一部で私が誤った情報を与えた場合に誰かが訂正を持っているなら私に知らせてください。

54
mVChr

$()はinstanceof _(new $())_はinstanceof _(new $.fn.init())_です

JQueryで採用されている手法は、これを実現する方法です。 $()は、常にnewキーワードで呼び出されたかのように戻ります。ただし、function jQuery() {...}内のthis参照で条件付きスイッチを使用する代わりに、すべての場合に外部デリゲートオブジェクトを使用します。この外部デリゲートオブジェクトjQuery.fn.init() {...}にはjQueryプロトタイプが与えられているため、そのオブジェクト 'type'はjQueryであり、そのすべてのインスタンスは実際にはjQueryのインスタンスです。 。

8
orca