jQuery.core_02
在上一节中有提到,jQuery对象的实例化实质上是调用了init构造器。即使不让init构造器成为jQuery函数的原型链的成员函数也不会有大的影响。
下面粗略看一下jQuery.prototype对象
jQuery.fn = jQuery.prototype = { //为什么要将constructor设置为jQuery constructor: jQuery, //初始化jQuery实例的长度 length: 0, //将该实例转换成数组 toArray: function(){ return slice.call( this ); }, //通过下标来获取对象 //如果没有传参数,或参数小于0 get: function( num ){ return num != null ? ( num < 0 ? this[ num + this.length ]) : this[ num ] : slice.call( this ); }, pushStack: function( elems ){ // console.log( this.constructor === jQuery); //true var ret = jQuery.merge( this.constructor(),elems); ret.preObject = this; return ret; }, each: function( callback ){ return jQuery.each( this, callback ); }, map: function( callback ){ return this.pushStack( jQuery.map( this, function( elem, i ){ return callback.call( elem, i, elem ); } ) ); }, slice: function(){ return this.pushStack( slice.apply( this, arguments )); }, first: function(){ return this.eq(0); }, last: function(){ return this.eq(-1); }, eq: function(i){ var len = this.length, j = +i + ( i < 0 : len : 0); return this.pushStack( j>= 0 && j < len ? [ this[ j ] ] : [] ); }, end: function(){ return this.preObject || this.constructor(); }, push: push, sort: arr.sort, splice: arr.splice }
这里的代码读起来不费劲,只是有个问题要提出下: 为什么在jQuery.prototype对象里要强制的将constructor设置为jQuery?
其实上一节有提到过,jQuery的实例化是通过init构造函数来实现的。每个实例对象都是有constructor的属性的,这个constructor
是对构造器的引用, 正常情况下,这个constructor属性保存着对init函数的引用,不过,由于设置了 init.prototype = jQuery.prototype.
这是constructor 是内部的Object构造函数。