maeshimaの日記

メモ書きです

jQuery.extend

jQueryのプロトタイプに関数を定義する方法 - willnetの日記 - g:javascriptで書いたようにjQuery.extend()がよくわかってかったので調べた。

jQuery日本語リファレンスだと説明が古いようなので本家のリファレンスを参照した。
Utilities/jQuery.extend - jQuery JavaScript Library

ソース

jQuery.extendとjQuery.fn.extendは同じ関数。

jQuery.extend = jQuery.fn.extend = function() {
	// copy reference to target object
	var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;

	// Handle a deep copy situation
	if ( typeof target === "boolean" ) {
		deep = target;
		target = arguments[1] || {};
		// skip the boolean and the target
		i = 2;
	}

	// Handle case when target is a string or something (possible in deep copy)
	if ( typeof target !== "object" && !jQuery.isFunction(target) )
		target = {};

	// extend jQuery itself if only one argument is passed
	if ( length == i ) {
		target = this;
		--i;
	}

	for ( ; i < length; i++ )
		// Only deal with non-null/undefined values
		if ( (options = arguments[ i ]) != null )
			// Extend the base object
			for ( var name in options ) {
				var src = target[ name ], copy = options[ name ];

				// Prevent never-ending loop
				if ( target === copy )
					continue;

				// Recurse if we're merging object values
				if ( deep && copy && typeof copy === "object" && !copy.nodeType )
					target[ name ] = jQuery.extend( deep, 
						// Never move original objects, clone them
						src || ( copy.length != null ? [ ] : { } )
					, copy );

				// Don't bring in undefined values
				else if ( copy !== undefined )
					target[ name ] = copy;

			}

	// Return the modified object
	return target;
};

リファレンス

jQuery.extend( [deep], target, object1, [objectN] )

deep (Optional) Boolean If set, the merge becomes recursive (i.e. deep copy).
target Object The object to extend.
object1 Object The object that will be merged into the first.
objectN (Optional) Object More objects to merge into the first.

使い方

引数に何をいくつ指定したかによって挙動が異なる。

  • 第一引数にtrueを指定すると、object1をextendする挙動が変わる(deepなcopyになる)
  • targetを一つだけ指定したときはjQueryオブジェクトやjQuery.prototypeオブジェクトを拡張
  • object1などを指定した場合はtargetに指定したオブジェクトを拡張して返す

雑感

  • 別に上書き防止みたいなことはしてないっぽい
  • 関数だけじゃなくて他のプロパティもコピーする
  • 関数を複数定義しない限りはjQuery.fn.hoge = function () {};みたいな感じで直接代入してもいいかも