JavaScript类装饰器是TC39 Stage 3提案,由TypeScript和Babel支持,用于类定义阶段的元编程,以非侵入方式统一注入横切关注点,如日志、权限、冻结结构、自动注册等,需注意其无this、不支持私有字段及纯函数原则。

JavaScript 类装饰器目前是 TC39 Stage 3 提案,尚未成为正式标准,但 TypeScript 和 Babel(配合插件)已提供稳定支持。它不是运行时魔法,而是在类定义阶段执行的元编程工具,核心价值在于**不侵入业务逻辑,统一注入横切关注点**——比如日志、权限、性能监控、自动绑定或结构约束。
类装饰器的基本写法与参数
类装饰器是一个函数,接收两个参数:target(被装饰的类本身,即构造函数)和 context(包含类名、类型等元信息的对象)。它必须返回一个类(可原样返回,也可返回新类)。
- target 是函数对象,比如
User构造函数,可直接在其上添加静态属性或方法 - context.name 是字符串形式的类名,可用于日志或注册标识
- 装饰器在模块加载时立即执行,早于任何实例创建,因此无法访问
this或实例状态 - 若返回新类,需确保继承原类原型链,否则实例方法会丢失
常见实用场景
类装饰器适合处理影响整个类行为的逻辑,而不是单个方法。
-
冻结类结构:用
Object.seal()封装构造函数和原型,防止意外扩展 - 自动注册:把类名或实例工厂存入全局 Map 或容器,用于依赖注入或插件系统
-
添加默认静态字段:如
target.version = '1.0'或target.isController = true - 标记废弃:在开发环境输出警告,提示该类即将移除
-
注入基类行为:动态混入生命周期钩子(如
onInit、onDestroy),供子类调用
搭配方法/访问器装饰器协同使用
单独用类装饰器往往不够精细,实际项目中常组合使用:
立即学习“Java免费学习笔记(深入)”;
- 用类装饰器声明一个“可销毁资源类”,再用方法装饰器标注哪些方法需在销毁前清理(如
@beforeDispose) - 类装饰器设置统一的 API 基础配置(如 baseURL),方法装饰器负责具体接口路径和请求参数
- 类装饰器启用响应式代理机制,访问器装饰器(
@observable)标记哪些属性需要触发更新 - 多个装饰器叠加时,从上到下、从右到左执行,外层先运行,结果传给内层
注意事项与避坑点
现阶段使用类装饰器,要清醒认识它的边界和限制:
- 不能装饰私有字段(
#field),提案未覆盖该语法 - 不要在装饰器里做异步操作或依赖实例状态,它没有
this - 避免副作用:装饰器应尽量纯,不修改外部变量、不发请求、不操作 DOM
- Babel 默认不启用类装饰器,需配置
@babel/plugin-proposal-decorators并设version: "2023-05" - TypeScript 中需开启
"experimentalDecorators": true和"emitDecoratorMetadata": true(如需元数据)


















