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的指向问题。
网友评论