javascript 无法原生实现 java 式抽象类,但可通过运行时校验(构造器抛错、方法内检测 super 调用)、typescript 编译期约束(abstract class/override)及 jsdoc+eslint 工程规范协同模拟等效效果。

JavaScript 原生 ES6 类不支持 abstract 关键字,也没有编译期强制检查机制,因此无法像 Java 那样在语法层面“禁止实例化抽象类”或“漏写抽象方法就报错”。但可以通过运行时校验 + 约定 + 工具辅助,模拟出等效的约束效果。
用构造器抛异常模拟“禁止实例化抽象类”
在基类构造函数中检测 this.constructor === BaseClass,若是直接 new 基类就抛错:
- 子类继承后,
this.constructor指向子类,不会触发报错 - 若有人误写
new BaseService(),立即中断并提示“BaseService 是抽象类,不可直接实例化” - 这是最轻量、最通用的模拟方式,无需额外依赖
在关键方法里检查子类是否重写了它
对必须被重写的方法(如 execute()),在方法体内判断 super.execute === this.execute:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 如果为
true,说明子类没重写,直接抛Error - 配合
protected命名习惯(如加下划线前缀_execute)或文档注明,强化语义 - 调用发生在首次运行时,不是编译时,但能有效拦截错误使用
结合 TypeScript 实现真正编译期约束
若项目已用或可引入 TypeScript,直接使用 abstract class 和 abstract method:
-
abstract class Task { abstract run(): void; }—— 子类不实现run(),TS 编译直接报错 - 子类必须用
override显式标记重写,避免拼写错误导致静默继承 - IDE 实时提示、类型检查、重构支持都完整,是目前最接近 Java 抽象类体验的方式
用 JSDoc + ESLint 补充工程规范
在纯 JavaScript 项目中,可通过注释和工具链增强约束力:
- 在基类方法上写
/** @abstract */,配合 ESLint 插件(如eslint-plugin-jsdoc)检查子类是否覆盖 - 团队统一约定:所有需重写的方法命名以
onXXX或doXXX开头,并在文档中标为 “must override” - 单元测试中增加断言,验证子类实例调用该方法时不走父类默认逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










