JavaScript继承场景下如何调用子构造函数的getDetails方法?
问题原因
你的代码问题出在原型继承赋值的顺序错误:
你先为Teacher的初始原型对象添加了getDetails方法和mainSubject属性,之后才执行Teacher.prototype = Object.create(Person.prototype)将Teacher的原型整体替换为继承自Person的新原型对象,之前添加的子类属性和方法会被直接覆盖丢失,因此调用时只能找到父类Person的同名方法。
修复方案
调整代码执行顺序,先完成原型继承的赋值,再在子类原型上添加自定义的属性和方法即可:
let Person = function() { }; Person.prototype.personName = "Smith"; Person.prototype.age = 37; Person.prototype.getDetails = function() { return `Person Name: ${this.personName}. Age is ${this.age}`; }; let Teacher = function() { }; // 第一步:先完成原型继承,替换Teacher的原型对象 Teacher.prototype = Object.create(Person.prototype); // 可选:修正constructor指向,保证实例构造函数指向符合预期 Teacher.prototype.constructor = Teacher; // 第二步:再在子类原型上添加特有属性和方法 Teacher.prototype.mainSubject = "Physics"; Teacher.prototype.getDetails = function() { return `Main subject is ${this.mainSubject}`; }; let teacher1 = new Teacher(); console.log(teacher1.getDetails()); // 输出:Main subject is Physics
原理说明
JS中调用实例方法时会沿着原型链向上查找:
- 实例本身找不到方法时,会先查找自身构造函数的prototype对象,存在就直接调用
- 如果子类prototype上存在和父类prototype同名的方法,就会优先调用子类方法,实现覆盖效果
内容的提问来源于stack exchange,提问作者JsCat
相关产品推荐
相关产品推荐

