首页 > 代码库 > jQuery对象的创建(一)
jQuery对象的创建(一)
在jQuery的常规用法中,执行“$()”返回的是一个jQuery对象,在源码中,它是这样定义的:
... var jQuery = function() { return new jQuery.fn.init(); } ... jQuery.fn = jQuery.prototype;
可以得出以下几个结论:
1、jQuery.fn.init()就是jQuery.prototype.init();
2、init()函数是一个构造函数,就是通过调用它创建的jQuery对象,它定义在jQuery()的原型中;
... var init = jQuery.fn.init = function(){ ... return this; } init.prototype = jQuery.fn;
可以得出以下几个结论:
1、init()构造函数最后返回了这个新对象的引用;
2、用jQuery()的原型覆盖了init()的原型;
现在的问题是,为什么jQuery会这么写呢?
再看一遍,我们的目的是创建一个jQuery类,它包含了一系列可调用的函数,实例化这个类得到jQuery对象,它可以这么写:
var jQuery = function(){ ... } jQuery.prototype = function(){ ... } var j = new jQuery();
显然,jQuery不是这样的,他使用了无new构造,就像下面这样:
var jQuery = function(){ return new init(); } jQuery.prototype = function(){ ... } var init = function(){ ... return this; } init.prototype = function(){ ... }
但是,如果这样写,jQuery函数就仅仅成为一个入口了,init函数才是真正的实现,因此jQuery将init()放在了jQuery.prototype()里面,即:
var jQuery = function(){ return new jQuery.prototype.init(); } jQuery.prototype = function(){ ... init: function(){ ... return this; } } init.prototype = function(){ ... }
此时,还有一个问题:新创建的对象无法访问jQuery.prototype()中的其他属性,解决方法是:将jQuery.prototype传递给jQuery.prototype.init.prototype
var jQuery = function(){ return new jQuery.prototype.init(); } jQuery.prototype = function(){ ... init: function(){ ... return this; } } jQuery.prototype.init.prototype = jQuery.prototype;
创建jQuery对象的整个流程如下:
“调用$()方法”->“调用jQuery.prototype.init()构造函数”->“根据选择器不同返回不同的jQuery对象”->“不同jQuery对象中相同的方法写在jQuery.prototype中”->“将jQuery.prototype传递给jQuery.prototype.init.prototype,这样新创建的对象才可以访问通用方法”
jQuery对象的创建(一)