es6 class 无原生抽象类支持,需用 new.target 拦截构造和方法抛错模拟:禁止直接实例化、强制子类实现抽象方法、允许含具体方法。

ES6 的 class 本身没有抽象类的关键字,比如 Java 中的 abstract,也不支持直接声明抽象类或抽象方法。它只是原型继承的语法糖,底层仍是函数和原型链。但你可以用运行时检查的方式模拟抽象类的行为,达到“禁止实例化 + 强制子类实现方法”的效果。
抽象类的核心目标
- 不能被
new直接实例化 - 至少有一个方法要求子类必须重写(否则调用时报错)
- 可以包含已实现的公共逻辑(具体方法)
关键实现方式:构造器拦截 + 方法抛错
class Shape {
constructor() {
// 检查是否是直接 new Shape(),而不是子类调用 super()
if (new.target === Shape) {
throw new Error('抽象类 Shape 不允许直接实例化');
}
}
// 抽象方法:子类必须覆盖,否则调用时会报错
area() {
throw new Error('子类必须实现 area() 方法');
}
// 具体方法:可直接使用
display() {
console.log(`面积是:${this.area()}`);
}
}
子类正常继承并实现抽象方法:
完整的Galileo AI平台 TypeScript/JS SDK 参考,用于评估、观察和保护 GenAI 应用。适用于构建 Node.js 或 TypeScript 项目。
class Circle extends Shape {
constructor(radius) {
super(); // 必须调用,否则 this 未定义
this.radius = radius;
}
area() {
return Math.PI * this.radius ** 2;
}
}
// ✅ 正常使用
const c = new Circle(3);
c.display(); // 输出:面积是:28.274333882308138
// ❌ 下面会报错
// new Shape(); // Error: 抽象类 Shape 不允许直接实例化
// new Circle().area(); // 如果没实现 area,就会触发 throw 错误
注意点
-
new.target是判断调用者的关键:new.target === Shape表示当前正在直接构造Shape实例 -
super()在子类构造器中必须调用,且要在访问this前执行 - 抽象方法不强制在构造器里检查是否被重写(那样太重),而是在首次调用时抛错,更轻量也更符合 JS 动态特性
- TypeScript 才有真正的
abstract class和abstract method语法,ES6 纯运行时不提供语言级支持
不复杂但容易忽略










