
お世話になります。現在jQueryのコードを読んでいるのですが、どうしてもわからないところがあります。
jQuery1.11.1の2774行目、jQuery.merge(...)と自分自身を呼び出していますが、これはjQuery中でどのような処理をして実現しているのでしょうか?jQuery.merge = function(){...};としているわけでもないのに呼び出せているのが理解できません。
mergeメソッド自体は、450行目、jQuery.extend内で定義されているようです。
以下簡易化したjQueryです。
var window = this; // ブラウザ以外で実行する場合のみ必要
(function(){
jQuery = window.jQuery = function( selector, context ) {
return new jQuery.fn.init( selector, context );
};
jQuery.fn = jQuery.prototype = {
hello: function(){
console.log("hello from fn!"); // ここをjQuery.logと書けるようにしたい
}
};
jQuery.extend = jQuery.fn.extend = function() {};
jQuery.extend({
log: function(msg){
console.log(msg);
}
});
init = jQuery.fn.init = function( selector, context ) {
console.log("Hello");
};
init.prototype = jQuery.fn; // ここをjQuery.logと書けるようにしたい
}
)();
jQuery().hello();
No.2ベストアンサー
- 回答日時:
argumentsは引数の配列です。
jQuery.extend({
merge : function(){}
})
extendを呼び出している部分は上記のようになっているため
argument[0]はmerge関数をもったオブジェクトとなります。
それを踏まえて、extend関数を読むと
176行目 target = arguments[0] // targetはmerge関数を持っているオブジェクト
177行目 i = 1
178行目 length = arugments.length // 1 (引数は一つしか与えていないので)
196行目 if(i === length) // ↑よりifの条件に一致
197行目 target = this; // thisはjQueryのオブジェクト
198行目 i--; // i=0
201行目 if ( (options = arguments[ i ]) != null ) { // optionsにmerge関数を持っているオブジェクトが入る
205行目 for ( name in options ) { // optionsのプロパティー名でループ
// mergeの場合は、name="merge"が入っている
206行目 src = target[ name ]; // targetはjQueryオブジェクト
// jQuery["merge"]はまだないのでsrc=undefined
207行目 copy = options[ name ]; // copyにmerge関数が入る
229行目 target[ name ] = copy; // target["merge"] = merge関数 ここでjQueryオブジェクトにmerge関数が入る
難しいのはthisがjQueyオブジェクトだということだと思いますが
javascriptのthisは関数を呼び出したオブジェクトが入ります。
extend関数はjQuey.extend({...})と呼び出されている訳ですから
jQuery.extend
↑extendはこのjQueryが呼び出しているわけですから、thisはこのjQUeryオブジェクトという事になります。
byDesignさん、回答ありがとうございます!やっと理解出来ました!
mergeなどのjQuery.extendのメソッドは引数として設定されていたのですね。言われてやっと気づけました。
thisのところも分からなかったので、ありがたかったです。jsのthisは特殊なんですね(万年プログラミング初心者なのでググって初めて知りました)。重ね重ね回答頂いて、本当にありがとうございます!
No.1
- 回答日時:
jQuery.extendは引数が1つの場合、jQuery自体を拡張するようになっているためです。
196行目の以下の行でtargetをthis(jQuery)としています。
if ( i === length ) {
target = this;
i--;
}
ありがとうございます!
byDesignさんの回答のおかげでやっと理解出来ました!
196行目の後203行目で、
options = arguments[ i ] //arguments[0](中身はjQuery.extend)をoptionsに代入
206行目で、
copy = options[ name ]; // jQuery.extend[メソッド名]と同義
最後229行目で、
target[ name ] = copy;
としてjQuery本体にメソッドを追加しているので間違いないでしょうか?
質問の主旨から外れてしまうのですが、なぜarguments[0]でjQuery.extendを参照できているのでしょうか?調べた所、argumentsは関数に渡された引数を参照するものだということなのですが、なぜこの場合の最初の引数がjQuery.extendになっているのかわかりません。
もしお時間あればご回答いただければとてもありがたいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Shell.ApplicationでのIEオブ...
-
jquery か javascript で json ...
-
event.srcElementの動的設定
-
文字を移動させその位置を表示...
-
イベントリスナーで読み込んだ...
-
JSPの処理の途中で、JavaScript...
-
以下のコードを実行しても、オ...
-
VB.netでタイマーがスタートし...
-
VB.NET2003 テキストボックスに...
-
VBA SORT Applyでエラー
-
〔Excel:VBA〕マクロの実行が異...
-
正整数の半角数字かどうか判定する
-
C#でボタン名を変更しても動く
-
javascriptで「オブジェクトを...
-
VBAによる第3、4水準文字の判定...
-
alert()が実行できない
-
JavaScriptによる....
-
エクセルVBA/ Formatで文字列が...
-
JavaScriptでこの正規表現を利...
-
slideToggleの動きがおかしい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Webページ中の javascript をVB...
-
フォルダ内のファイル名を取得...
-
ローカルのレジストリを読みたい
-
Shell.ApplicationでのIEオブ...
-
クラス デフォルトプロパティの...
-
イベントevt?evt.target:event....
-
javaScriptでグローバル変数に...
-
ASP.NETでURLにマッピングされ...
-
タブブラウザで focus() を実...
-
JSの「document.getElementById...
-
strictモードでなぜエラーにな...
-
エクセル2010のvbaについて
-
event.srcElementの動的設定
-
一定時間経つと画像を消す方法
-
javascritの(e)または(event)に...
-
イベントリスナに登録される fu...
-
画面間でのJavaScrip...
-
Googleカレンダーリスト表示
-
JSPの処理の途中で、JavaScript...
-
以下のコードを実行しても、オ...
おすすめ情報