new.target是唯一轻量原生的运行时依据,用于杜绝非法实例化、验证子类字段、注入审计元信息,且不依赖装饰器、Proxy或第三方库。

要让核心鉴权基类在构造阶段就杜绝非法实例化、防止绕过安全校验,new.target 是唯一轻量、原生、不可伪造的运行时依据。它不依赖装饰器、不修改原型链、不引入第三方库,直接从语言机制层面锁定调用意图。
强制禁止直接 new 基类实例
鉴权基类本身不应被直接实例化,否则会跳过子类定义的策略逻辑。利用 new.target 与类自身严格比对,即可在第一行就中断非法路径:
- 在基类 constructor 开头写
if (new.target === AuthBase) throw new TypeError('AuthBase 是抽象基类,禁止直接 new') - 该判断在
new AuthBase()时立即触发,而new JwtAuth()(JwtAuth 继承 AuthBase)中 new.target 是 JwtAuth,条件不成立,流程继续 - 无需额外标记或静态属性,语义明确且无法被子类覆盖或绕过
确保子类已声明必要鉴权字段
仅阻止直接 new 不够——还必须验证子类是否真正承担了安全职责。结合 new.target 和实例状态检查:
- 在基类 constructor 末尾添加校验:
if (!(this instanceof new.target) || this.tokenStrategy === undefined) { throw new Error('子类必须定义 tokenStrategy'); } - 子类需在 super() 后显式赋值:
this.tokenStrategy = new JwtStrategy(...) - 也可配合
Object.defineProperty(this, 'tokenStrategy', { writable: false })防止后续篡改
区分初始化上下文并注入审计元信息
new.target 指向真实被 new 的类名,可用于记录谁在何时创建了何种鉴权实例:
- 在基类中:
console.log(`[AUTH INIT] ${new.target.name} created at ${Date.now()}`) - 该日志不会被继承链混淆(不像
this.constructor.name可能被代理或重写) - 配合环境变量可自动开启生产审计模式:当
process.env.NODE_ENV === 'production'时,将 new.target.name 写入安全日志系统
不依赖 Proxy,也不侵入子类代码
相比 Proxy.construct 拦截,new.target 方案更底层、更稳定:
- Proxy 需包装类、全局替换 new 行为,易与框架(如 Vue、React 的类组件)冲突
- new.target 在每个构造函数内部天然可用,子类只需正常 extends + super(),无额外负担
- 类型系统(TypeScript)能配合 new.target 做编译期提示,例如用
abstract class AuthBase加上 new.target 运行时校验,实现双重保障

















