美文网首页
jQuery源码中为什么要写constructor: jQuer

jQuery源码中为什么要写constructor: jQuer

作者: 果然 | 来源:发表于2019-04-08 10:31 被阅读0次
    jquery为什么要把constructor指向自己呢

    jQuery2.2.4源码中,第91行jQuery.fn = jQuery.prototype = {}中,有这么一句代码:

    constructor: jQuery,
    

    那么,为什么要把constructor指向jQuery自己呢?

    我们用几个实例,理解一下这个问题。

    通常情况下,在构造函数的原型链上写属性的时候,我们可以用下面两种方式:

    obj.prototype.aaa = "bbb";
    
    obj.prototype = {
        aaa = "bbb"
    }
    

    以上两种写法在大部分情况下是一样的,
    但是,有时候还是有区别,比较一下,如下代码运行后结果:

    实例1,宝马是一种车

     console.log($().jquery);
    function car(){
    }
    car.prototype.wheel = 5;
    car.prototype.door = 3;
    
    var bmw = new car();
    console.log(bmw.constructor);
    

    运行结果:ƒ car(){
    }

    实例2,宝马不是一种车

    function car(){
    }
    car.prototype = {
    wheel : 4,
    door : 4
    }
    var bmw = new car();
    console.log(bmw.constructor);
    

    运行结果:ƒ Object() { [native code] }

    我们可以看到,第一种写法,bmw.constructor指向了构造函数car,而第二种写法,bmw.constructor指向了构造函数Object。

    因为第一种写法,是在构造函数的原型链上添加了属性

    而第二种写法,是在构造函数的原型链上覆盖了属性

    所以,造成了constructor指向出现了问题

    那怎么解决这个问题呢?

    让实例2中的宝马,继续属于一种车。

      function car(){
     }
    car.prototype = {
     constructor : car,
     wheel : 4,
     door : 4
    }
     var bmw = new car();
     console.log(bmw.constructor);
    

    运行结果:
    ƒ car(){
    }

    总结:
    加上一句constructor指向自己,就能修正constructor的指向问题。

    相关文章

      网友评论

          本文标题:jQuery源码中为什么要写constructor: jQuer

          本文链接:https://www.haomeiwen.com/subject/aazyiqtx.html