javascript中class本身不直接实现装饰器,而是作为被修饰目标;装饰器需用@语法写在class/方法/属性前,属stage 3提案,须经typescript或babel编译才能运行。

JavaScript 中 class 语法本身不直接“实现”装饰器,而是作为装饰器的目标被修饰——装饰器必须写在 class 声明前、方法定义前 或 属性声明前,通过 @ 符号触发。它不是 class 的内置能力,而是一套独立的语法提案,需编译支持才能运行。
类装饰器:作用于整个 class
类装饰器函数接收一个参数:target(类构造函数本身),可返回新类或直接修改原类:
- 装饰器在模块加载时同步执行,不是实例化时才运行
- 常见用途:添加静态属性、密封类、注入元数据、注册类到容器
- 示例中
@sealed会调用Object.seal(target)和Object.seal(target.prototype),防止后续扩展
方法装饰器:增强类中的函数行为
方法装饰器放在方法定义前,函数接收三个参数:target(原型对象)、propertyKey(方法名)、descriptor(属性描述符):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 必须返回 descriptor(否则方法会被设为
undefined) - 通常通过重写
descriptor.value来包裹原始逻辑,比如加日志、权限校验、缓存 - 注意:不能直接修改
this上下文,要用originalMethod.apply(this, args)保持绑定
属性装饰器(TypeScript 主流支持,Babel 需额外配置)
用于类字段(如 @observable name = 'a'),但原生 JavaScript 不支持字段装饰器语法:
- TypeScript 需启用
"experimentalDecorators": true和"useDefineForClassFields": true - Babel 默认不解析字段装饰器,需插件配合且行为不稳定
- 典型用法:定义 getter/setter、设置响应式、绑定验证规则
使用前提与注意事项
装饰器目前仍是 ECMAScript Stage 3 提案,尚未进入正式标准:
- 所有浏览器原生不支持,必须用 TypeScript 编译或 Babel 转译(推荐
@babel/plugin-proposal-decorators) - 装饰器只能用于 class 及其成员(方法、访问器、字段、参数),不能用于普通函数
- 装饰器函数必须是顶层声明,不能是箭头函数或嵌套函数
- TypeScript 5.0+ 与 Babel 的装饰器执行模型不同,混用易出错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










