使用 extends 关键字实现继承,并在子类构造函数中通过 super() 调用父类构造函数以完成初始化。这种方式利用原型链自动建立父子关系,同时允许在子类中通过 super.methodname() 调用父类方法。

如何定义一个继承自父类的子类
定义子类时,在 class 声明后紧跟 extends 和父类名称即可。子类必须在其构造函数中调用 super(),否则在访问 this 之前会抛出引用错误。这种写法比 ES5 的原型赋值更直观,且自动处理了原型的指向。

class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(this.name + ' makes a noise.');
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name); // 调用父类构造函数
this.breed = breed;
}
speak() {
super.speak(); // 调用父类方法
console.log(this.name + ' barks.');
}
}
const dog = new Dog('Rex', 'German Shepherd');
dog.speak();
运行上述代码将输出:
Rex makes a noise.
Rex barks.
如何在子类中扩展或重写父类方法
在子类中定义与父类同名的方法会自动覆盖(重写)父类方法。若需保留父类行为,必须在子类方法内部显式调用 super.methodName()。这适用于需要增强功能而非完全替换的场景。静态方法同样可以通过 super.staticMethod() 调用。

class Calculator {
static add(a, b) {
return a + b;
}
}
class AdvancedCalculator extends Calculator {
static add(a, b) {
const baseResult = super.add(a, b);
return baseResult * 2; // 扩展父类逻辑
}
}
console.log(AdvancedCalculator.add(2, 3));
运行结果将输出 10,因为父类返回 5,子类将其乘以 2。
当父类构造函数抛出异常时会发生什么
如果父类构造函数在执行过程中抛出异常,子类的 super() 调用将中断,导致子类实例无法创建。此时 this 未被初始化,任何对 this 的访问都会触发 ReferenceError。开发者应在父类构造函数中加入参数校验或使用默认值来避免此类崩溃。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











