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

2019-04-08  本文已影响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的指向问题。

上一篇下一篇

猜你喜欢

热点阅读