6

jQueryコンストラクターの種類は、その機能を別のコンストラクターにマップしjQuery.fn.initます。

jQuery = function( selector, context ) {
    return new jQuery.fn.init( selector, context, rootjQuery );
},

なぜだろうと思います。

この質問は非常に似ていますが、回答者でさえ、なぜ質問に実際に答えなかったのかを認めています

この質問はまだ答えられていません

これは組織的な目的のためだけですか?作成者は、init 関数を jQuery コンストラクター定義内に配置するのではなく、パッケージ化したかったのかもしれません。

.init()プロトタイプにメソッドを含める理由はありますか? 誰も使ってないと思う$('.something')...init()...

この質問.initは、プロトタイプに搭載する必要がないことを示しています。

そして、ダン・ハーバートの答えが単に構造/読みやすさの目的であることを示唆しているこの質問を見つけました。

結論として、このコンストラクター/プロトタイプ マッピングのおかしなビジネスは不要であると確認できますか? jQuery.fn.init機能うまくいく ように私には思えます:

  • クロージャのどこでも
  • jQueryオブジェクト( jQuery.initvs jQuery.fn.init)
  • または、私にとって最も理にかなっているのは、jQuery関数/コンストラクター定義内で直接、マッピングを置き換えnew jQuery.fn.initて回避することです。jQuery.fn.init.prototype = jQuery.fn
4

2 に答える 2

4

jQueryコンストラクターは、その機能を別のコンストラクターにマップします

実際には、これは実際jQueryにはコンストラクター関数ではなく、コンストラクター関数としても見なされるべきではありません。定義上、コンストラクターの責任はインスタンス プロパティを初期化することですが、実際にはjQuery. また、呼び出しnew jQuery()はナンセンスです。インスタンスjQueryを作成するためのファクトリ関数でjQuery.fn.initあり、それ以上のものではありません。

では、なぜ彼らがjQuery実際のコンストラクターとして使用しなかったのか疑問に思っているのではないでしょうか?

彼らは常に呼び出すコンストラクターを望んでいなかったのでnew、ファクトリー関数を望んでいました。それは私には問題ありませんが、私が反対する傾向があるのは、彼らのパターンが非常に不可解であり、意図を完全に反映していないということです.

私の意見では、より良い名前を選択した方がはるかに良かったでしょう:

function jQuery(selector, context) {
    return new jQuery.Set(selector, context);
}

jQuery.Set = function (selector, context) {
    //constructor logic
};

//allows syntaxic sugar
jQuery.fn = jQuery.Set.prototype = {
    constructor: jQuery.Set,
    //methods
};

私はほとんど再マッピングjQuery.fn.initしただけですがjQuery.Set、突然すべてがより理にかなっています。上記のコードを見ると、次のことが簡単にわかります。

  1. jQueryjQuery.Setオブジェクトを作成するためのファクトリ関数です。
  2. jQuery.fnjQuery.Set.prototypeプロトタイプを変更するために常に書く必要がない代わりに、シンタックスシュガーとしてのみ存在します。

さて、ソースでは、彼らが次のことを行っていることもわかりますが、これはjQuery実際のコンストラクターではないため意味がありません。また、インスタンスjQuery.prototype.initを作成していないため、設定は役に立たないようです:jQueryjQuery.prototype

jQuery.fn = jQuery.prototype = {
      constructor: jQuery

この背後にある理由の 1 つはjQuery.prototypejQuery.fn.

ただし、別の正当な理由は、somejQueryObj instanceof jQuery通常は true を返さないのに、おそらく true を返したいということです。上記のパターン (jQuery.Set を使用) を使用すると、次のことがわかります。

jQuery() instanceof jQuery; //false
jQuery() instanceof jQuery.Set; //true

しかし、 を に設定するとprototype、何が起こるか見てみましょう。jQueryjQuery.Set.prototype

jQuery.prototype = jQuery.Set.prototype;
jQuery() instanceof jQuery; //true!

これらの設計上の決定に至ったすべてを理解するのは容易ではなく、重要な点を見落としているかもしれませんが、私には設計が複雑すぎるように思えます。

于 2013-11-03T23:27:35.920 に答える
-1

コンストラクターをチェーンできます。すこし...

だから代わりに

$('.someClass').hide();
$('.someOtherClass').hide();

できるよ

$('.someClass').hide().init.call($.fn, '.someOtherClass').hide();

これは機能しますが、冗談でもあります。

于 2013-11-03T22:42:38.283 に答える