重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

お世話になります。現在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();

A 回答 (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オブジェクトという事になります。
    • good
    • 0
この回答へのお礼

byDesignさん、回答ありがとうございます!やっと理解出来ました!
mergeなどのjQuery.extendのメソッドは引数として設定されていたのですね。言われてやっと気づけました。

thisのところも分からなかったので、ありがたかったです。jsのthisは特殊なんですね(万年プログラミング初心者なのでググって初めて知りました)。重ね重ね回答頂いて、本当にありがとうございます!

お礼日時:2014/10/20 17:02

jQuery.extendは引数が1つの場合、jQuery自体を拡張するようになっているためです。



196行目の以下の行でtargetをthis(jQuery)としています。
if ( i === length ) {
target = this;
i--;
}
    • good
    • 0
この回答へのお礼

ありがとうございます!
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になっているのかわかりません。

もしお時間あればご回答いただければとてもありがたいです。

お礼日時:2014/10/19 07:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!