新闻中心

JS装饰器编程_Decorator应用指南

2025-11-14
浏览次数:
返回列表
装饰器是一种函数,用于在不修改原始代码的情况下增强类、方法、属性或参数的行为。通过@符号应用于目标声明,运行时接收元信息并返回修改后的描述符或对象。类装饰器可修改类定义,如冻结实例或添加元数据;方法装饰器通过 descriptor 控制方法行为,实现只读、日志、性能监控等;属性和参数装饰器主要用于元数据标注,常用于依赖注入和参数标记,需配合 Reflect Metadata 使用。尽管 J*aScript 装饰器尚处 Stage 2,TypeScript 和框架如 Angular、NestJS 已广泛支持,提供声明式编程能力,提升代码解耦与复用性。

js装饰器编程_decorator应用指南

装饰器(Decorator)是一种特殊类型的声明,可以被附加到类声明、方法、访问器、属性或参数上,用于在不修改原始代码的情况下增强或修改其行为。J*aScript 装饰器目前处于提案阶段(Stage 2),但在 TypeScript 和部分现代框架(如 Angular、NestJS)中已被广泛使用。

什么是装饰器?

装饰器本质上是一个函数,它会在运行时被调用,并传入目标对象的相关元信息,比如类的构造函数、方法描述符、属性名等。通过返回新的描述符或修改原对象,实现对目标功能的扩展或控制。

语法使用 @ 符号开头,紧跟装饰器函数名,写在目标声明之前:

@logMethod
class User {
  @readonly
  getName() { return "Tom"; }
}

类装饰器:控制类的行为

类装饰器接收一个参数——类的构造函数,可用于监听、替换或修改类定义。

常见用途包括:

  • 自动注册类到全局容器(如依赖注入系统)
  • 冻结类实例防止扩展
  • 添加静态属性或方法

示例:为类添加元数据和实例锁定

function sealed(constructor: Function) {
  Object.seal(constructor);
  Object.seal(constructor.prototype);
}

@sealed
class Person {
  name = "Alice";
}

方法装饰器:拦截与增强方法调用

方法装饰器应用于类的方法,接收三个参数:target(原型对象或构造函数)、propertyKey(方法名)、descriptor(属性描述符)。

通过修改 descriptor,可以实现只读、日志记录、性能监控等功能。

示例:实现方法只读

PLC编程入门基础知识 中文doc版 PLC编程入门基础知识 中文doc版

可编程序控制器,英文称Programmable Controller,简称PC。但由于PC容易和个人计算机(Personal Computer)混淆,故人们仍习惯地用PLC作为可编程序控制器的缩写。它是一个以微处理器为核心的数字运算操作的电子系统装置,专为在工业现场应用而设计,它采用可编程序的存储器,用以在其内部存储执行逻辑运算、顺序控制、定时/计数和算术运算等操作指令,并通过数字式或模拟式的输入、输出接口,控制各种类型的机械或生产过程。本平台提供PLC编程入门基础知识下载,需要的朋友们下载看看吧!

PLC编程入门基础知识 中文doc版 1 查看详情 PLC编程入门基础知识 中文doc版 function readonly(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
  descriptor.writable = false;
}

class MathLib {
  @readonly
  add(a: number, b: number) { return a + b; }
}

尝试重写 add 方法将抛出错误(非严格模式下静默失败)。

进阶用法:记录方法执行时间

function log(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
  const original = descriptor.value;
  descriptor.value = function (...args: any[]) {
    console.log(`Call: ${propertyKey} with`, args);
    const start = Date.now();
    const result = original.apply(this, args);
    console.log(`Time: ${Date.now() - start}ms`);
    return result;
  };
  return descriptor;
}

属性与参数装饰器:细粒度控制

属性装饰器用于监听或修改类中的属性声明,接收 target 和属性名。常用于依赖注入或字段验证。

参数装饰器则作用于方法参数,可用于标记参数用途或收集元数据。

示例:参数装饰器标记请求上下文

function ReqParam(target: any, methodName: string, paramIndex: number) {
  console.log(`Parameter at index ${paramIndex} in ${methodName}`);
}

class Controller {
  getUser(@ReqParam id: number) {}
}

注意:属性和参数装饰器不能修改属性值或参数本身,主要用于元数据标注,通常配合 Reflect Metadata 使用。

基本上就这些。装饰器提供了一种声明式编程方式,让逻辑解耦更清晰。虽然原生 J*aScript 尚未正式支持,但借助 Babel 或 TypeScript 已可实战使用。合理设计装饰器能显著提升代码可维护性和复用性。

以上就是JS装饰器编程_Decorator应用指南的详细内容,更多请关注其它相关文章!


# 情况下  # 资阳商城网站建设  # 珠江新城网站建设  # 厦门什么叫网站优化  # 靖边网站建设平台推广  # 子比主题seo不行  # 如何建设内部论坛网站  # 年度营销推广计划表格  # 沙河关键词seo优化  # 潍坊小语种网站推广公司  # ios关键词榜单排名算法变化  # 它很  # 如何防止  # javascript  # 进阶  # 是一个  # 复用  # 有什么区别  # 主要用于  # 应用于  # 是一种  # app  # typescript  # js  # java 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量  提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案  AO3同人作品网入口 AO3搜索引擎官网永久地址  SteamMachine定价或为699美元 大家想入手吗?  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】  理解Python模块与全局变量的作用域管理  Composer的 "conflict" 字段有什么用_如何声明不兼容的包以避免依赖冲突  必由学官网快捷入口 必由学网页版在线学习平台  利用5118提升短视频内容效果_5118短视频关键词优化方法  Linux如何构建多环境配置管理_Linux多环境配置方案  J*aScript中高效管理与清空动态列表:避免循环陷阱  将JSON对象数组转置为键值对列表的实用指南  我的世界官方游戏入口 我的世界官网平台直达链接  纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析  电脑IP地址怎么查 查看本机IP地址的几种方法  妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画  Golang如何使用new_Go new分配内存机制讲解  格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施  在Go开发中优雅管理ListenAndServe进程:GoSublime集成方案  J*a里如何使用forEach遍历Map_Map遍历方法说明  漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站  QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口  抓大鹅解压小游戏 抓大鹅摸鱼解压入口  c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解  钉钉视频会议声音异常如何处理 钉钉会议音频修复技巧  Yandex浏览器官方网页版入口 Yandex浏览器最新版官网  J*a里如何使用N*igableMap进行导航操作_可导航Map操作技巧解析  在J*a项目里如何构建对象之间的契约_接口约束的实际落地  yandex入口引擎手机版 yandex安卓版下载入口  126邮箱手机版登录官网2026_126手机邮箱免费入口最新  HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全  中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】  Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程  Python Socket多播通信中指定源IP地址的实践指南  极速漫画官方主页网址 极速漫画漫画在线浏览官网链接  手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议  Mac怎么锁定备忘录_Mac备忘录加密设置教程  AO3最新官网入口公告_2025AO3镜像站实时查询方法  html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】  QQ官网正版登录链接 QQ在线登录入口最新  解决深度学习模型训练初期异常高损失与完美验证准确率问题  自定义Bag-of-Words实现:处理带负号的词汇权重  Golang指针如何与map组合使用_Golang map指针组合实践  J*a 递归快速排序中静态变量的状态管理与陷阱  必由学在线入口 必由学网页版快速登录入口  深入理解Promise链:如何在catch后中断then的执行  使用J*aScript检测输入元素是否包含在特定类中  C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法  移动端XML文件怎么转换成Excel 手机和平板上的解决方案 

搜索