( function( global, factory ) {
	"use strict";
	if ( typeof module === "object" && typeof module.exports === "object" ) {
		module.exports = global.document ?
			factory( global, true ) :
			function( w ) {
				if ( !w.document ) {
					throw new Error( "jQuery requires a window with a document" );
				}
				return factory( w );
			};
	} else {
		factory( global );
	}
} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
........
var version = "3.1.1",
	/* 
	 * jQuery构造函数创建时直接返回实例对象,此时就不需要
	 * jQuery = function( selector, context ) {//构造函数 }
	 * var a = new jQuery( selector, context);
	 * 而是jQuery( selector, context)就得到一个jQuery初始化实例对象
	 * 实际上这个构造函数并不是this指向的真实意义上的构造函数,而是工厂方式来创建实例。
	 */
	jQuery = function( selector, context ) {
//jQuery.fn.init构建的出来的实例对象,就是jQuery对象
//jQuery.fn.init.prototype = jQuery.fn;通过原型传递解决问题,把jQuery的原型传递给jQuery.fn.init.prototype
return new jQuery.fn.init( selector, context ); }, 
rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, 
rmsPrefix = /^-ms-/, rdashAlpha = /-([a-z])/g, 
fcamelCase = function( all, letter ) { return letter.toUpperCase(); };
 /* jQuery原型 * jQuery.fn引用jQuery原型prototype,为jQuery实例添加方法和属性 * 例如,我们常用的$('class').each、$('div').eq(0)、$(arr).push()、$(arr).slice()等 */ 
jQuery.fn = jQuery.prototype = {
    jquery: version, 
    constructor: jQuery, 
    length: 0, 
    toArray: function() { return slice.call( this ); }, 
    get: function( num ) { if ( num == null ) { return slice.call( this ); } return num < 0 ? this[ num + this.length ] : this[ num ]; }, 
    pushStack: function( elems ) { var ret = jQuery.merge( this.constructor(), elems ); ret.prevObject = this; return ret; }, 
   .......
}; 
/*
 * jQuery扩展插件 
* jQuery.extend 对jQuery本身的属性和方法进行了扩展 
* jQuery.fn.extend 对jQuery.fn的属性和方法进行了扩展 
* 两种扩展其实是同一方法不同对象的调用 
* eg:
* var obj1 = {alert:function(){}} 
* var obj2 = {consoleLog = function(){}} 
* jQuery.fn.extend(obj1,obj2) 
*/
jQuery.extend = jQuery.fn.extend = function() { 
    /* 
    * 形参对象arguments,支持多种参数形式 
    * eg: 
    * $.extend(obj1) 
    * $.extend(obj1,obj2,obj3,......) 
    * $.extend(true,obj1,obj2,obj3,......) 
    */
    var options, name, src, copy, copyIsArray, clone, 
    target = arguments[ 0 ] || {}, //初始化target,target引用形参arguments[0] 
    i = 1, 
    length = arguments.length, 
    deep = false;
    //第一个参数为布尔值时,表示是否深度拷贝 
     if ( typeof target === "boolean" ) {
       deep = target; //arguments[0],变量deep表示是否深度拷贝 target = arguments[ i ] || {};
      //target去第二个参数,即arguments[1]
       i++; 
    } 
    if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { target = {}; } 
    /* 
    * 如果只参数只传入一个对象时 
    * target引用this(jQuery.extend 或 jQuery.fn)
    * target添加方法就是给this添加方法
    * 即将传入对象整合到全局jQuery或jQuery.fn中
    */ 
	if ( i === length ) {
		target = this;
		i--;
	}

	for ( ; i < length; i++ ) {
		if ( ( options = arguments[ i ] ) != null ) {
			for ( name in options ) {
				//target继承参数的属性和方法
				src = target[ name ];
				copy = options[ name ];

				if ( target === copy ) {
					continue;
				}
				// 深度拷贝
				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 : {};
					}
					target[ name ] = jQuery.extend( deep, clone, copy );
				// Don't bring in undefined values
				} else if ( copy !== undefined ) {
					target[ name ] = copy;
				}
			}
		}
	}
	// 返回重载合并传入参数后的对象
	return target;
};


/*
 * 为jQuery对象扩展方法
 */
jQuery.extend( {
	isArray: Array.isArray,
	isWindow: function( obj ) {
		return obj != null && obj === obj.window;
	},
	isNumeric: function( obj ) {
		return ( type === "number" || type === "string" ) &&
			!isNaN( obj - parseFloat( obj ) );
	},
	type: function( obj ) {
		if ( obj == null ) {
			return obj + "";
		}
		return typeof obj === "object" || typeof obj === "function" ?
			class2type[ toString.call( obj ) ] || "object" :
			typeof obj;
	},
	each: function( obj, callback ) {
		var length, i = 0;
		if ( isArrayLike( obj ) ) {
			length = obj.length;
			for ( ; i < length; i++ ) {
				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
					break;
				}
			}
		} else {
			for ( i in obj ) {
				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
					break;
				}
			}
		}

		return obj;
	},
	trim: function( text ) {
		return text == null ?
			"" :
			( text + "" ).replace( rtrim, "" );
	},
	makeArray: function( arr, results ) {
		var ret = results || [];
		if ( arr != null ) {
			if ( isArrayLike( Object( arr ) ) ) {
				jQuery.merge( ret,
					typeof arr === "string" ?
					[ arr ] : arr
				);
			} else {
				push.call( ret, arr );
			}
		}

		return ret;
	},
	map: function( elems, callback, arg ) {
		var length, value,
			i = 0,
			ret = [];
		if ( isArrayLike( elems ) ) {
			length = elems.length;
			for ( ; i < length; i++ ) {
				value = callback( elems[ i ], i, arg );

				if ( value != null ) {
					ret.push( value );
				}
			}
		} else {
			for ( i in elems ) {
				value = callback( elems[ i ], i, arg );

				if ( value != null ) {
					ret.push( value );
				}
			}
		}
		return concat.apply( [], ret );
	},
.........
} );

if ( typeof Symbol === "function" ) {
	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
}


.........
jQuery.fn.ready = function( fn ) {
	readyList
		.then( fn )

		// Wrap jQuery.readyException in a function so that the lookup
		// happens at the time of error handling instead of callback
		// registration.
		.catch( function( error ) {
			jQuery.readyException( error );
		} );

	return this;
};

jQuery.parseJSON = JSON.parse;

if ( typeof define === "function" && define.amd ) {
	define( "jquery", [], function() {
		return jQuery;
	} );
}

var _jQuery = window.jQuery,
	_$ = window.$;
jQuery.noConflict = function( deep ) {
	if ( window.$ === jQuery ) {
		window.$ = _$;
	}
	if ( deep && window.jQuery === jQuery ) {
		window.jQuery = _jQuery;
	}
	return jQuery;
};
........
return jQuery;
} );

  

 

整理核心代码
(function(){  
    //jQuery变量定义  
    var jQuery  = function(){...};  
    //jQuery原型定义(包含核心方法)                
    jQuery.fn = jQuery.prototype = {...};  
    //把jQuery的原型传递给jQuery.fn.init.prototype
    jQuery.fn.init.prototype = jQuery.fn;  
    //提供jQuery静态方法与对象方法的扩展函数  
    jQuery.extend = jQuery.fn.extend = function(){...};   
    //后面依次有多个对jQuery静态方法的扩展  
    jQuery.extend({...});  
    //后面依次有多个对jQuery对象方法的扩展  
    jQuery.fn.extend({...});  
    jQuery.support = (function() {...})();  
    //提供统一时间管理,jQuery内部使用,并不对外开放  
    jQuery.event = {...};  
    //Event类似于Java的POJO类.传递事件的对象  
    jQuery.Event = function( src, props ) {...};   
    //Sizzle选择器,一个框架,可独立使用。  
    (function(){  
        ...  
        jQuery.find = Sizzle;  
        ...  
    })();  
    ...  
    //将定义的jQuery定义为全局变量  
    window.jQuery = window.$ = jQuery;  
    ...  
})();  

  

以上就是jQuery的架构分析,jQuery提供的所有属性方法都是对jQuery对象,jQuery.fn对象的属性和方法进行了扩展

这样的方式便于开发者维护代码,为JQ添加新方法时,不需要修改jQuery的原型,又可以快速扩展JQ功能。也为其他开发者提供了一个扩展接口

以上为本前端菜鸟对jQuery的理解,如有偏颇,欢迎指教。

posted on 2017-05-08 11:35  前端小透明  阅读(254)  评论(0)    收藏  举报