javaScript类继承通过extends实现,底层基于原型链;子类需在constructor中调用super()初始化父类this,super可传参并支持方法重写、静态方法及内置类继承。

javascript 中类的继承主要通过 extends 关键字 实现,这是 es6 引入的语法糖,底层仍基于原型链。它让子类能复用父类的属性和方法,并支持重写、扩展逻辑。
使用 extends 和 super 实现基础继承
子类通过 extends 声明继承父类,构造函数中必须调用 super()(否则报错),以初始化父类的 this。super() 相当于执行父类 constructor。
- 不调用 super():子类构造函数中无法访问 this,会直接报 ReferenceError
- super() 必须在使用 this 之前调用
- super 可以传参,这些参数会传给父类 constructor
示例:
class Animal {
constructor(name) {
this.name = name;
}
speak() { console.log(`${this.name} 发声`); }
}
class Dog extends Animal {
constructor(name, breed) {
super(name); // 初始化父类 this
this.breed = breed;
}
speak() { console.log(`${this.name} 汪汪!`); }
}
方法重写与 super 调用父类方法
子类可定义同名方法覆盖父类逻辑;若需在子类方法中调用父类版本,用 super.方法名()。
立即学习“Java免费学习笔记(深入)”;
- super 不仅可用于 constructor,也可用于普通方法和 getter/setter
- super 指向父类的原型对象(即 Parent.prototype),不是父类实例
- 静态方法中 super 指向父类本身(Parent)
例如:speak() { super.speak(); console.log(‘然后摇尾巴’); }
静态方法与继承关系
Static 方法也会被继承。子类可通过 子类名.静态方法 调用父类静态方法,也可用 super.静态方法 在子类静态方法中调用父类版本。
- class A { static foo() { return ‘A’; } }
class B extends A {}
B.foo(); // ‘A’ - class C extends A { static foo() { return super.foo() + ‘ + C’; } }
继承内置类(如 Array、Error)
extends 可继承原生构造函数,使自定义类拥有内置行为(如 instanceof 正确、数组方法可用)。
- class MyArray extends Array {}
const arr = new MyArray(1, 2);
arr.map(x => x * 2); // ✅ 正常工作 - 注意:某些内置类(如 promise)在旧环境可能有兼容性限制,但现代引擎普遍支持
基本上就这些。虽然语法简洁,但理解 super 的绑定时机和 this 的初始化顺序很关键——它不是魔法,只是对原型链和 [[Construct]] 的封装。