JavaScript 原生不支持抽象类,但可通过构造器检测new.target === BaseClass抛错禁止实例化,并在方法体内throw new Error强制子类重写;配合extends/super与JSDoc等可提升可维护性。

JavaScript 本身没有原生的抽象类(abstract class)语法,但可以用 class 配合运行时检查和约定,模拟出抽象类的行为——即禁止直接实例化、强制子类实现特定方法。
用构造函数抛错模拟“不可实例化”
在抽象类的 constructor 中主动检测是否被直接调用(而非通过 super() 被继承调用),如果是就抛出错误:
class Animal {
constructor() {
if (new.target === Animal) {
throw new Error('Animal 是抽象类,不能直接实例化');
}
}
<p>speak() {
throw new Error('子类必须实现 speak 方法');
}
}new.target 指向当前构造函数被调用时的“目标构造器”。如果直接写 new Animal(),new.target 就是 Animal;如果在子类中调用 super(),new.target 是子类本身,不会触发报错。
用方法体抛错强制子类重写
把本该由子类实现的方法,在父类中留空或仅抛错。这不是编译时检查,而是在运行时调用时提醒开发者:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 子类未重写
speak()却调用了它 → 立即报错,便于快速发现遗漏 - 这种写法简单明确,无需额外工具或转译
- 适合中小型项目或团队内部约定优先的场景
配合 extends 和 super 的完整示例
一个可工作的子类必须调用 super(),且应重写抽象方法:
class Dog extends Animal {
constructor(name) {
super(); // 必须调用,否则报错
this.name = name;
}
<p>speak() {
return <code>${this.name} 汪汪!</code>;
}
}</p><p>// ✅ 正确
const dog = new Dog('旺财');
console.log(dog.speak()); // "旺财 汪汪!"</p><p>// ❌ 报错:Animal 是抽象类,不能直接实例化
// const a = new Animal();</p><p>// ❌ 报错:子类必须实现 speak 方法(如果 Dog 没重写 speak)
// const badDog = new Dog('二哈'); badDog.speak();进阶:用 Symbol 或私有字段增强意图表达(可选)
想更清晰地标记抽象方法,可用 Symbol 作为占位符,或结合 JSDoc 注释提升可读性:
/**
* @abstract
*/
class Shape {
get area() {
throw new Error('子类必须实现 get area');
}
}虽然 JS 引擎不识别 @abstract,但 VS Code、WebStorm 等编辑器能据此提示警告,TypeScript 也能配合 abstract 关键字做静态检查(注意:TS 的 abstract class 仅在类型层面有效,编译后仍是普通 JS 类)。

















