构造函数间原型继承后实例构造函数显示为父类的问题
构造函数间原型继承后实例构造函数显示为父类的问题
这个问题其实是原型继承里的常见小坑,我来给你捋明白~
你之所以看到实例mike的构造函数显示为Person,核心原因是你在设置原型继承的时候,弄丢了Student.prototype上的constructor属性。
咱们拆解一下背后的逻辑:
- 默认情况下,每个构造函数的
prototype对象都自带一个constructor属性,指向构造函数本身——也就是Student.prototype.constructor原本指向Student,Person.prototype.constructor指向Person。 - 当你执行
Object.setPrototypeOf(Student.prototype, Person.prototype)时,相当于把Student.prototype的原型链顶端换成了Person.prototype。这时候Student.prototype自身不再有constructor属性,当访问mike.constructor时,会顺着原型链往上找,最终找到Person.prototype.constructor,也就是Person。
知道原因就好解决了,只需要在设置完原型继承后,手动把Student.prototype的constructor属性指回Student就行:
//Inheritance Object.setPrototypeOf(Student.prototype, Person.prototype) // 新增这一行,修正constructor指向 Student.prototype.constructor = Student Student.prototype.introduce = function () { console.log(`My name is ${this.firstName} and I study ${this.course}`); }
这样修改后,你再打印mike,控制台里显示的构造函数就会是Student了,而且mike.constructor也会正确指向Student构造函数。
备注:内容来源于stack exchange,提问作者asdasd
相关产品推荐
相关产品推荐

