You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:30:05