extends用于类继承,底层基于原型链;子类需在constructor中调用super()初始化父类this;可重写方法并用super.调用父类版本;静态方法可继承和覆盖;不能继承普通函数,私有字段不被继承。

在 JavaScript 中,extends 关键字用于让一个类继承另一个类的属性和方法,这是 ES6 引入的面向对象语法糖,底层仍基于原型链实现。
基本语法:子类继承父类
使用 extends 的子类会自动获得父类的实例属性和方法(除私有字段外),但必须在构造函数中调用 super() 来初始化父类的 this。
- 子类构造函数中若定义了 constructor,第一行必须是 super()(否则报错)
- super() 相当于调用父类的 constructor,可传参以初始化父类状态
- 不写 constructor 时,JavaScript 会自动添加一个隐式的 constructor(...args) { super(...args); }
示例:
class Animal {constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a sound`);
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name); // 必须先调用 super()
this.breed = breed;
}
woof() {
console.log(`${this.name} barks!`);
}
}
const dog = new Dog("Buddy", "Golden Retriever");
dog.speak(); // Buddy makes a sound(继承自 Animal)
dog.woof(); // Buddy barks!(自身方法)
重写父类方法(方法覆盖)
子类可以定义与父类同名的方法,实现覆盖。如需在覆盖方法中调用父类版本,用 super.方法名()。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- super.speak() 在子类方法中调用父类同名方法
- 注意:super 只能在对象方法或构造函数中使用,不能在普通函数里用
示例:
class Cat extends Animal {constructor(name, color) {
super(name);
this.color = color;
}
speak() {
super.speak(); // 先执行父类逻辑
console.log(`${this.name} meows softly`); // 再添加子类逻辑
}
}
静态方法也能被继承
父类的 static 方法会被子类继承,可通过子类名直接调用;子类也可定义自己的 static 方法,或用 super.静态方法名 在静态方法中调用父类静态方法。
- static 方法不会被实例继承,只属于类本身
- 子类调用 super.staticMethod() 需在子类的 static 方法内部使用
示例:
class Vehicle {static getType() { return "Vehicle"; }
}
class Car extends Vehicle {
static getType() { return "Car"; }
static getFullType() {
return `${super.getType()} → ${this.getType()}`;
}
}
console.log(Car.getType()); // "Car"
console.log(Car.getFullType()); // "Vehicle → Car"
注意事项与常见陷阱
- 不能用 extends 继承普通函数或箭头函数——只能继承 class 或 null
- 若想继承内置类(如 Array、Error),需确保正确调用 super() 并处理 this(某些场景需额外 return)
- 类声明不被提升,必须先定义父类再定义子类
- 私有字段(#field)不会被继承,子类无法访问父类的私有成员
继承的本质仍是原型链:子类的 prototype.__proto__ 指向父类的 prototype,而子类的 constructor.__proto__ 指向父类 constructor。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










