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构造函数。

原文地址:https://www.cnblogs.com/branches/p/4890487.html