2009-11-18 2 views
19

少し拡張された質問はなぜjQueryがjQueryがこれを行う理由:jQuery.fn.init.prototype = jQuery.fn?

を行うのか
jQuery.fn = jQuery.prototype = { 
init: function() {...}, 
    f1: function() {...}, 
    ... 
}; 
jQuery.fn.init.prototype = jQuery.fn; 

単にinit.prototypeなどをinit.prototypeに追加してみませんか?それは唯一の美学か、いくつかの深いアイデアがありますか?

+0

f1()をinit.prototypeに追加してどういう意味が分かりませんか?それは何かに "何"を加えていない、それはプロトタイプを割り当てている。 –

+0

私はもちろん「割り当て」を意味します。私の英語のために申し訳ありません。そして、なぜ、単にすべての機能をinit.prototypeに割り当てるのではないかという疑問がありますか? jQuery.prototypeに割り当てられた理由と、jQuery.prototype.init.prototypeに割り当てられたjQuery.prototypeより – NilColor

+0

jQueryのデザインパターンに関する関連の質問:http://stackoverflow.com/q/12143590/1048572 – Bergi

答えて

20

jQuery.fnは、jQuery.prototypeのエイリアスです。私はそれが美的でタイピングの理由から定義されていると思います。

ので

jQuery.fn.init.prototype = jQuery.fn; 

は、実際にこれを行う必要がある理由として

jQuery.prototype.init.prototype = jQuery.prototype; 

あり、このforum postが便利です:

それは(INITを与える)と同じ 機能jQueryオブジェクトとしてのプロトタイプ。したがって、 コンストラクタとしてinit()を呼び出すと、 "return new jQuery.fn.init( セレクタ、コンテキスト);の が"それは オブジェクトのプロトタイプを使用しています。 の構造体です。これにより、init() がjQueryコンストラクタ の代わりに使用されます。

あなたが達成することは、jQuery.fn.initコンストラクタから返されたオブジェクトがjQueryメソッドにアクセスできることです。

+0

はい。 '.fn'は' .prototype'のショートカットです。 しかし、なぜそれらがjQuery.prototypeを拡張するのですか?それは 'jQuery.fn.init.prototype = jQuery.fn'ですか? 'jQuery.fn.init.prototype'を直接拡張しないのはなぜですか? – NilColor

+0

フォーラムリンクありがとうございます。それは私が多くを助ける! – NilColor

47

jQuery.fn.initは、jQuery(".some-selector")または$(".some-selector")を呼び出すと実行される機能です。あなたはjquery.jsからこのスニペットでこれを見ることができます:

jQuery = window.jQuery = window.$ = function(selector, context) { 
    // The jQuery object is actually just the init constructor 'enhanced' 
    return new jQuery.fn.init(selector, context); 
} 

ので、実際には、あなたが言及ラインはjQueryのjQueryのオブジェクトに機能を追加することができますどのようにするために重要である、jQueryの自体の内部とプラグインの両方から。これはjQuery.fn.whatever介して追加機能を意味し、(最初のスニペットがコンストラクタとしてjQuery.fn.initを治療するための「新しい」使用しているため)この関数のプロトタイプとしてjQuery.fnを割り当てることによって

jQuery.fn.init.prototype = jQuery.fn; 

:これはラインでありますすべてのjQuery呼び出しによって返されたオブジェクトですぐに使用できます。

jQuery.fn.foo = function() { alert("foo!"); }; 
jQuery(".some-selector").foo(); 

あなたはあなたが実際に何をやっている最初の行に「jQuery.fn.foo」のことを追加して宣言する場合:だから例えば、簡単なjQueryプラグインが作成される可能性がありますし、このように使用

関数を2行目のようなjQuery関数で作成されたすべてのjQueryオブジェクトのプロトタイプに変換します。これにより、jQuery関数の結果に対して簡単に 'foo()'を呼び出し、プラグイン関数を呼び出すことができます。

要するに、この行がjQueryに存在しない場合、実装の詳細が変更された場合、jQueryプラグインの作成はより冗長で、将来の破損の対象となります。

+2

素晴らしい答え、本当に私には意味がありました – 32423hjh32423

+0

これは私がずっと読んできた最も明らかなコメントです。ありがとうございました。 – asumaran

+0

答え/コメントに質問を挿入して申し訳ありませんが、このようにjQueryに関数を追加すると、その関数がページのすべての要素で使用できるようになります。そして、他のjQueryオブジェクトなどのような、要素以外のものにもその関数を利用できるようにしますか?そして、 "jQuery = window.jQuery = window。$ = function(...")は、3つの構文がすべて同じ構文であることを示す単なる方法ですか? –

関連する問題