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

JavaScript继承用法疑问:我的代码是否正确使用了继承?

关于你代码中继承用法的解答

嘿,我来帮你梳理一下继承的正确用法~首先明确说:你当前的代码并没有使用继承。虽然你把书籍和杂志都归类为ReadingMaterial的实例,但这只是复用了同一个类来创建对象,并没有体现继承的核心——子类继承父类并扩展特性。

为什么当前代码没用到继承?

你现在的写法是直接用new ReadingMaterial()创建所有书籍和杂志对象,它们本质上都是同一个类的实例,没有区分“书籍”和“杂志”作为独立的子类。继承的意义在于让子类(比如Book、Magazine)复用父类(ReadingMaterial)的属性和方法,同时可以添加自己独有的属性或方法。

正确的继承实现方式

下面是修改后的代码,用ES6的extends和super来实现继承:

// 父类:通用阅读材料
class ReadingMaterial {
  constructor(author, type, price, title) {
    this.author = author;
    this.type = type;
    this.price = price;
    this.title = title;
  }

  // 给父类加一个通用方法,比如打印基础信息
  printBasicInfo() {
    console.log(`${this.title} - ${this.author},价格:${this.price}`);
  }
}

// 子类:书籍,继承自ReadingMaterial
class Book extends ReadingMaterial {
  // 书籍添加独有的属性:ISBN编号
  constructor(author, type, price, title, isbn) {
    // 调用父类构造函数,传递通用属性
    super(author, type, price, title);
    // 初始化子类独有的属性
    this.isbn = isbn;
  }

  // 书籍专属方法:打印完整书籍信息
  printBookInfo() {
    this.printBasicInfo();
    console.log(`ISBN:${this.isbn}`);
  }
}

// 子类:杂志,继承自ReadingMaterial
class Magazine extends ReadingMaterial {
  // 杂志添加独有的属性:发行周期
  constructor(author, type, price, title, issueCycle) {
    super(author, type, price, title);
    this.issueCycle = issueCycle;
  }

  // 杂志专属方法:打印完整杂志信息
  printMagazineInfo() {
    this.printBasicInfo();
    console.log(`发行周期:${this.issueCycle}`);
  }
}

// 用Book子类创建书籍实例
const books = [
  new Book("Lars Tvede", "Fagliteratur", "399kr", "Supertrends", "978-8771511647"),
  new Book("Rasmmus Tantholdt", "Faglitteratur", "249kr", "Med åbne øjne", "978-8702298654"),
  new Book("Jussi Alder", "Skønlitteratur", "349kr", "Offer 2117", "978-8702312345")
];

// 用Magazine子类创建杂志实例
const magazines = [
  new Magazine("Euroman", "Magasin", "99kr", "Mick Øgendahl", "月刊"),
  new Magazine("Alt for damerne", "Magasin", "149kr", "Boligindretning", "周刊")
];

// 展示书籍的函数
function showBooks() {
  console.log("=== 书籍列表 ===");
  books.forEach(book => book.printBookInfo());
}

// 展示杂志的函数
function showMagazines() {
  console.log("=== 杂志列表 ===");
  magazines.forEach(magazine => magazine.printMagazineInfo());
}

关键知识点解释

  • extends:用来声明子类继承父类,比如class Book extends ReadingMaterial表示Book是ReadingMaterial的子类,自动拥有父类的属性和方法。
  • super():在子类构造函数中必须调用,用来执行父类的构造函数,把父类的属性传递给子类实例,确保父类的初始化逻辑被执行。
  • 子类扩展:你可以给子类添加独有的属性(比如书籍的ISBN、杂志的发行周期)或方法,让不同类型的阅读材料更有区分度,同时复用父类的通用逻辑。

这样修改后,你就真正利用了继承的特性:既复用了父类的通用代码,又让子类拥有自己的专属特性,代码结构也更清晰。

内容的提问来源于stack exchange,提问作者Benjamin Nielsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 08:38:13