核心是通过封装边界、委托契约和原型隔离锁死父类关键行为。使用私有字段隔离状态与校验逻辑,强制 super 调用并内置守卫,将可重写方法转为实例属性函数,构造阶段封死入口并校验参数。

核心不是“禁止子类改”,而是让破坏性修改在语法或运行时就失效——通过封装边界、委托契约和原型隔离,把父类关键行为锁死在子类无法触达的位置。
用私有字段(#)隔离核心状态与校验逻辑
所有不该被子类读写的数据、中间计算结果、安全校验,一律放进私有字段或私有方法。子类连访问语法都不合法,更别说覆盖或篡改。
- 父类中定义
#token = crypto.randomUUID(); #validate() { return this.#token.length > 10; } - 子类哪怕重写同名公有方法,也无法调用
#validate—— 直接语法报错 - 对外只暴露带防护的 getter 或方法,例如
get status() { return this.#validate() ? 'ok' : 'error'; }
强制 super 调用并内置守卫逻辑
允许子类扩展的方法,必须显式委托 super,且父类在关键入口加运行时检查,拒绝绕过原始流程。
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
- 父类方法中加入守卫:
if (new.target !== Parent && !this.#validated) throw new Error('must call super.save() first'); - 子类正确写法:
save() { super.save(); this.#logToAnalytics(); } - 禁止空实现、直接重写或删除
super调用 —— 否则核心校验、初始化、清理等环节会被跳过
避免原型级裸奔,收关键行为到实例或闭包
原型上的方法默认全局可替换,Child.prototype.process = () => {} 会直接覆盖整个类的行为。这不是继承漏洞,是设计暴露面太大。
- 把可重写的方法改为实例属性函数:
this.handle = () => { /* 安全封装后逻辑 */ };—— 不可被原型级篡改 - 必要时运行时检测:
if (Object.getPrototypeOf(this).process !== Parent.prototype.process) console.warn('process was overridden'); - 公有 API 尽量不依赖原型链查找,优先走实例委托或静态工具函数
构造阶段封死入口,防初始化污染
父类构造函数里别调用可能被子类重写的方法;同时限制子类传参范围,防止用非法参数触发异常路径。
- 错误示范:
constructor() { this.init(); }—— 若init被子类重写,可能导致this未就绪就执行 - 正确做法:核心初始化放在私有方法里,公有方法只做安全包装
- 对入参做白名单校验,比如只接受
{ mode: 'safe' | 'debug' },拒绝未知字段或类型
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










