什么是JavaScript装饰器_装饰器如何增强类和函数
发布时间 - 2026-01-02 00:00:00 点击率:次JavaScript装饰器是处于TC39 Stage 3的语法特性,本质为接收目标、名称、描述符等参数的函数式元编程工具,用于在运行时包裹行为以实现日志、权限等横切关注点;支持类、方法、访问器、属性及参数五种类型,各具不同参数与用途。
JavaScript装饰器是一种用于修改类、方法、访问器、属性或参数行为的语法特性,目前处于TC39提案的第三阶段(Stage 3),尚未正式纳入ECMAScript标准,但已被TypeScript和Babel等工具广泛支持。
装饰器的本质:函数式元编程
装饰器本质上是接收目标对象、成员名、描述符等参数的函数。它不改变原始代码逻辑,而是在运行时“包裹”或“劫持”原有行为,实现横切关注点(如日志、权限、缓存)的复用。
例如,一个简单的@log装饰器可自动打印方法调用信息:
function log(target, name, descriptor) {
const original = descriptor.value;
descriptor.value = function(...args) {
console.log(`调用 ${name},参数:`, args);
return original.apply(this, args);
};
return descriptor;
}
类装饰器:增强整个类的行为
类装饰器作用于类构造函数,可用于注册、注入依赖、添加静态属性或重写原型。
- 接受单个参数:target(类的构造函数)
- 可返回新构造函数来替换原类(需谨慎,可能破坏 instanceof)
- 常用于框架集成,如Angular的@Component、MobX的@observer
示例:为类自动添加版本号
function version(v) {
return function(target) {
target.version = v;
};
}
@version("1.2.0")
class ApiClient {}
console.log(ApiClient.version); // "1.2.0"
方法与访问器装饰器:控制执行逻辑
这类装饰器最常用,接收三个参数:target(原型或构造函数)、name(方法名)、descriptor(属性描述符),可通过修改de
scriptor.value或descriptor.get/set来增强行为。
- 可实现防抖、节流、只读校验、异步状态包装(如@loading)
- 能访问this上下文,适合处理实例状态
- 多个装饰器按从下到上顺序执行(类似洋葱模型)
属性与参数装饰器:补充元数据与校验
属性装饰器(@prop)通常用于收集字段信息(如序列化规则),不直接修改行为;参数装饰器(@inject)则常配合依赖注入使用,接收target、name、index(参数索引)。
- 属性装饰器无法直接拦截赋值,需配合Object.defineProperty或Proxy在类初始化时介入
- 参数装饰器本身不运行时生效,主要配合反射API(如Reflect.metadata)存储类型或注入标识
- TypeScript中常用于生成装饰器元数据,供运行时框架读取
# javascript
# java
# typescript
# app
# 工具
# proxy
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何挑选优质建站一级代理提升网站排名?
Java垃圾回收器的方法和原理总结
b2c电商网站制作流程,b2c水平综合的电商平台?
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
用v-html解决Vue.js渲染中html标签不被解析的问题
,网页ppt怎么弄成自己的ppt?
Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置
郑州企业网站制作公司,郑州招聘网站有哪些?
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
jQuery 常见小例汇总
详解jQuery中基本的动画方法
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
电商网站制作价格怎么算,网上拍卖流程以及规则?
如何解决hover在ie6中的兼容性问题
高端智能建站公司优选:品牌定制与SEO优化一站式服务
如何获取免费开源的自助建站系统源码?
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
济南网站建设制作公司,室内设计网站一般都有哪些功能?
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
如何在万网自助建站中设置域名及备案?
Java类加载基本过程详细介绍
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
nginx修改上传文件大小限制的方法
网站图片在线制作软件,怎么在图片上做链接?
如何在万网ECS上快速搭建专属网站?
浅述节点的创建及常见功能的实现
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
如何在IIS管理器中快速创建并配置网站?
如何在阿里云高效完成企业建站全流程?
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
如何快速搭建个人网站并优化SEO?
轻松掌握MySQL函数中的last_insert_id()
如何基于云服务器快速搭建网站及云盘系统?
Laravel如何处理和验证JSON类型的数据库字段
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
如何在IIS中配置站点IP、端口及主机头?
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
Android GridView 滑动条设置一直显示状态(推荐)
大学网站设计制作软件有哪些,如何将网站制作成自己app?
利用 Google AI 进行 YouTube 视频 SEO 描述优化
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
文字头像制作网站推荐软件,醒图能自动配文字吗?
如何在腾讯云免费申请建站?
javascript读取文本节点方法小结
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网

