什么是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(属性描述符),可通过修改descriptor.valuedescriptor.get/set来增强行为。

  • 可实现防抖、节流、只读校验、异步状态包装(如@loading
  • 能访问this上下文,适合处理实例状态
  • 多个装饰器按从下到上顺序执行(类似洋葱模型)

属性与参数装饰器:补充元数据与校验

属性装饰器(@prop)通常用于收集字段信息(如序列化规则),不直接修改行为;参数装饰器(@inject)则常配合依赖注入使用,接收targetnameindex(参数索引)。

  • 属性装饰器无法直接拦截赋值,需配合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在线体验官网