jqueryソース分析ノート:jQuery.extend


詳細
jQuery-2.1.4に基づいて、すべて注釈の中で尽くします
jQuery.extend = jQuery.fn.extend = function() {
	var options, name, src, copy, copyIsArray, clone,
		target = arguments[0] || {},//       
		i = 1,
		length = arguments.length,
		deep = false;//     

	// Handle a deep copy situation
	/* 
	 *             ,$.extend(true|false,target,src);
	 */
	if ( typeof target === "boolean" ) {
		deep = target;

		// Skip the boolean and the target
		//        boolean                ,i = 1;
		target = arguments[ i ] || {};
		i++;
	}

	// Handle case when target is a string or something (possible in deep copy)
	/*
	*                  (          。。),        ; :$.extend(undefined|'',src);
	*/
	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
		target = {};
	}

	// Extend jQuery itself if only one argument is passed
	/*
	 *   jQuery    ,          ;i = 1,length = 1;jquery            ,1:   ;2:    ;
	 *      $.sayHello()                                 $().sayHello;
	 * $.extend({                                       $.fn.extend({ sayHello: 'hello word' })
	 *    sayHello:function(){
	 *        alert('hello');
	 *    }
	 *  })
	 */
	if ( i === length ) {
		target = this;
		i--;   //i = 0;
	}
    
    //      
	for ( ; i < length; i++ ) {
		// Only deal with non-null/undefined values
		//      null|undefined
		if ( (options = arguments[ i ]) != null ) {
			// Extend the base object
			//for in      
			for ( name in options ) {
				src = target[ name ];
				copy = options[ name ];

				// Prevent never-ending loop
				/*       ,$.extend(name,{obj:name})
				*     target   copy  ,   src copy  
				*/
				if ( target === copy ) {
					continue;
				}

				// Recurse if we're merging plain objects or arrays
				//        
				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
					//      
					if ( copyIsArray ) {
						copyIsArray = false;
						clone = src && jQuery.isArray(src) ? src : [];
                     //        
					} else {
						clone = src && jQuery.isPlainObject(src) ? src : {};
					}

					// Never move original objects, clone them
					//      ,         ,, $.extend(true,{name:'zhangsan'},{student:[{name:'jack',age:23},{name:'tontjon',age:43}]})
					target[ name ] = jQuery.extend( deep, clone, copy );

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

	// Return the modified object
	return target;
};