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
、突然すべてがより理にかなっています。上記のコードを見ると、次のことが簡単にわかります。
jQuery
jQuery.Set
オブジェクトを作成するためのファクトリ関数です。
jQuery.fn
jQuery.Set.prototype
プロトタイプを変更するために常に書く必要がない代わりに、シンタックスシュガーとしてのみ存在します。
さて、ソースでは、彼らが次のことを行っていることもわかりますが、これはjQuery
実際のコンストラクターではないため意味がありません。また、インスタンスjQuery.prototype.init
を作成していないため、設定は役に立たないようです:jQuery
jQuery.prototype
jQuery.fn = jQuery.prototype = {
constructor: jQuery
この背後にある理由の 1 つはjQuery.prototype
、jQuery.fn
.
ただし、別の正当な理由は、somejQueryObj instanceof jQuery
通常は true を返さないのに、おそらく true を返したいということです。上記のパターン (jQuery.Set を使用) を使用すると、次のことがわかります。
jQuery() instanceof jQuery; //false
jQuery() instanceof jQuery.Set; //true
しかし、 を に設定するとprototype
、何が起こるか見てみましょう。jQuery
jQuery.Set.prototype
jQuery.prototype = jQuery.Set.prototype;
jQuery() instanceof jQuery; //true!
これらの設計上の決定に至ったすべてを理解するのは容易ではなく、重要な点を見落としているかもしれませんが、私には設計が複雑すぎるように思えます。