javascript原生不支持abstract关键字,但可通过构造器检测(new.target === baseclass时抛错)阻止实例化、在方法内用super.m === this.m校验子类是否重写、typescript的abstract class+override实现编译期约束,以及jsdoc+eslint工程规范协同保障抽象行为。

JavaScript 原生不支持 abstract 关键字,无法像 Java 那样在语法层面禁止实例化或强制重写方法。但可以通过运行时检查、命名约定、工具链配合等方式,在实际开发中模拟出可靠的抽象类效果。
用构造器检测阻止直接实例化
在基类 constructor 中判断当前构造函数是否就是该基类本身,若是则抛错:
- 写法简洁,兼容所有 ES6+ 环境,无需额外依赖
if (new.target === BaseTask) throw new Error('BaseTask 是抽象类,不可直接 new')- 子类调用
super()时,new.target指向子类,不会触发报错 - 用户一执行
new BaseTask()就立刻得到明确提示,避免静默错误
在关键方法里验证是否被子类重写
对必须覆盖的方法(如 execute()),在父类方法体中检查它是否仍是原始实现:
- 使用
super.execute === this.execute判断子类是否重写了该方法 - 为避免误判,可配合命名规范,比如把抽象方法命名为
_execute并加 JSDoc 注释说明“must override” - 首次调用时校验,虽非编译期检查,但能有效拦截逻辑错误
- 适合纯 JavaScript 项目,尤其搭配单元测试断言验证子类行为
用 TypeScript 实现真正编译期约束
如果项目已用或可引入 TypeScript,这是最接近原生抽象类的方案:
- 定义
abstract class Task { abstract run(): void; },子类不实现run就无法通过 TS 编译 - 配合
override修饰符,防止拼写错误导致意外继承父类空实现 - IDE 实时高亮、自动补全、重构支持完整,类型安全性和开发体验最佳
- 抽象方法参数和返回值建议单独定义
interface,提升复用性与可读性
配合 JSDoc 与 ESLint 强化工程规范
在大型 JS 项目中,靠人自觉容易遗漏,需工具辅助落地:
- 在基类方法上添加
/** @abstract */注释 - 启用
eslint-plugin-jsdoc插件,配置规则检查子类是否覆盖了带@abstract的方法 - 团队统一约定:抽象方法名以
_开头,文档中标注“必须重写”,并在 PR 检查中加入对应 lint 规则 - 结合测试用例,断言子类调用该方法时返回值/副作用与父类默认逻辑不同
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











