以下是对jquery源码学习的一些总结,待完善...
1.js文件总体结构如下: (function(){})(...省略3548行); 这应该相当于eval 一个function.
2. 每个$("")都会生成一个jQuery的对象,构造函数如下:
var jQuery = window.jQuery = window.$ =
function( selector, context )
{
return new jQuery.fn.init( selector, context );
}
3.jQuery.fn = jQuery.prototype={...}
对jQuery类的prototype赋值.他和jQuery.fn共享对象.
jQuery.fn.init.prototype = jQuery.fn; 再把jQuery.fn.init的prototype设为jQuery.fn即jQuery.prototype.
构造函数( return new jQuery.fn.init( selector, context ); ) 返回的都是一个jQuery对象.
4.jQuery.extend = jQuery.fn.extend = function() {...} 定义extend,该方法调用时将参数对象中的成员拷贝到
jQuery类上.jQuery[name] = objet[name];
5.jQuery.each(object, callback, args)函数就是通过extend方法加到jquery对象上的.调用时方式如下:
jQuery.each({
parent: function(elem){return elem.parentNode;},
parents: function(elem){return jQuery.dir(elem,"parentNode");},
next: function(elem){return jQuery.nth(elem,2,"nextSibling");},
}, function(name, fn){
jQuery.fn[ name ] = function( selector ) {
var ret = jQuery.map( this, fn );
if ( selector && typeof selector == "string" )
ret = jQuery.multiFilter( selector, ret );
return this.pushStack( jQuery.unique( ret ) );
};
});
jQuery.each中关键是通过 callback.apply( object[ name ], args )让object[ name ]对象(
如function(elem){return elem.parentNode;} )执行方法
function(name, fn){
jQuery.fn[ name ] = function( selector ) {
var ret = jQuery.map( this, fn );
if ( selector && typeof selector == "string" )
ret = jQuery.multiFilter( selector, ret );
return this.pushStack( jQuery.unique( ret ) );
};
}从而将object中的成员(方法)拷贝到jQuery.fn即jQuery.prototype上,从而增加jQuery对象上的方法