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
相关产品推荐
相关产品推荐

