新闻中心

J*aScript装饰器模式_Decorator使用

2025-11-25
浏览次数:
返回列表
装饰器模式通过函数动态扩展对象功能而不修改原代码。在 TypeScript 中,使用 @decorator 语法可对类、方法、属性、参数进行增强,如 Injectable 注册服务、Log 记录日志、Required 标记必填字段、QueryParam 识别参数用途,广泛用于权限控制、缓存、校验和依赖注入等场景。

javascript装饰器模式_decorator使用

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地给对象添加新功能,而不需要修改原有的代码。在 J*aScript 中,装饰器提供了一种优雅的方式来扩展类或方法的行为,尤其在 TypeScript 和现代框架(如 Angular、React + Babel 装饰器支持)中被广泛使用。

什么是装饰器(Decorator)

装饰器本质上是一个函数,用来“包装”或“增强”类、方法、属性或参数。它通过在定义时使用 @decoratorName 语法来应用,属于元编程的一种方式。

目前装饰器是 J*aScript 的提案功能,在 TypeScript 或使用 Babel 等工具的项目中可以启用。标准尚未完全定稿,但已被广泛应用。

装饰器的基本语法与类型

装饰器可以应用于以下几个位置:

  • 类装饰器:作用于整个类
  • 方法装饰器:作用于类的方法
  • 属性装饰器:作用于类的属性
  • 参数装饰器:作用于方法的参数
示例:启用装饰器(TypeScript 配置)

在 tsconfig.json 中启用实验性装饰器:

{
  "compilerOptions": {
    "target": "ES2016",
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true
  }
}

实际应用示例

1. 类装饰器:自动注册类

用于标记某个类为可注入服务或组件。

function Injectable(target: Function) {
  console.log('类已注册为可注入:', target.name);
}

@Injectable
class UserService {
  getName() {
    return 'Alice';
  }
}

// 输出:类已注册为可注入: UserService

2. 方法装饰器:日志记录

SmartB2B行业电子商务 SmartB2B行业电子商务

SmartB2B 是一款基于PHP、MySQL、Smarty的B2B行业电子商务网站管理系统,系统提供了供求模型、企业模型、产品模型、人才招聘模型、资讯模型等模块,适用于想在行业里取得领先地位的企业快速假设B2B网站,可以运行于Linux与Windows等多重服务器环境,安装方便,使用灵活。 系统使用当前流行的PHP语言开发,以MySQL为数据库,采用B/S架构,MVC模式开发。融入了模型化、模板

SmartB2B行业电子商务 0 查看详情 SmartB2B行业电子商务

在方法执行前后打印日志,常用于调试或监控。

function Log(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
  const originalMethod = descriptor.value;

  descriptor.value = function (...args: any[]) {
    console.log(`调用方法: ${propertyKey},参数:`, args);
    const result = originalMethod.apply(this, args);
    console.log(`方法返回值:`, result);
    return result;
  };

  return descriptor;
}

class Calculator {
  @Log
  add(a: number, b: number) {
    return a + b;
  }
}

const calc = new Calculator();
calc.add(2, 3);
// 输出:
// 调用方法: add,参数: [2, 3]
// 方法返回值: 5

3. 属性装饰器:标记字段

常用于 ORM 或表单验证场景。

function Required(target: Object, propertyKey: string) {
  console.log(`字段必填: ${propertyKey}`);
}

class LoginForm {
  @Required
  username!: string;
  password!: string;
}
// 输出:字段必填: username

4. 参数装饰器:标识参数用途

function QueryParam(target: Object, methodName: string, paramIndex: number) {
  console.log(`参数 ${paramIndex} 是查询参数,属于方法 ${methodName}`);
}

class UserController {
  getUsers(@QueryParam page: number, limit: number) {
    // 模拟分页请求
  }
}
// 输出:参数 0 是查询参数,属于方法 getUsers

装饰器的实际用途

装饰器在现代前端开发中有多种实用场景:

  • 权限控制:在方法上加 @Auth 装饰器,检查用户权限
  • 缓存结果:@Cache 装饰器避免重复计算或请求
  • 性能监控:@Timer 记录方法执行时间
  • 数据校验:配合 class-validator 使用 @IsEmail、@MinLength 等
  • 依赖注入:在 Angular 中用 @Injectable() 注册服务

基本上就这些。装饰器让代码更清晰、复用性更高,把横切关注点(如日志、权限)从核心逻辑中解耦出来。虽然原生 J*aScript 还未正式支持,但在工程化项目中已经非常实用。关键是理解其执行时机和目标对象的处理方式,避免副作用。

以上就是J*aScript装饰器模式_Decorator使用的详细内容,更多请关注其它相关文章!


# 如何实现  # seo竞价分词  # 岳塘区商城网站建设招标  # 天津网站优化收费  # 栖霞网站建设价格  # 晋源区公证seo优化  # seo工具分析方法  # 数据时代网站优化  # 贸易营销推广  # 云南seo快排必看  # 如何推广超市网站呢  # 是一种  # 几个  # 是一个  # 客户端  # 返回值  # 装饰器模式  # 而不  # 必填  # 表单  # 作用于  #   # app  # typescript  # json  # 前端  # js  # java  # word  # javascript  # react 


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


相关推荐: 必由学官网快捷入口 必由学网页版在线学习平台  C++指针和引用有什么区别_C++内存管理核心概念深度解析  在VS Code中配置和运行Dart程序的完整步骤  Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】  Eclipse怎么运行工程_Eclipse工程运行配置说明  Golang如何安装Swagger工具_GoSwagger文档生成环境  windows10怎么查看硬盘序列号_windows10硬盘id查询命令  在Typer应用中优雅地处理和重组任意命令行参数  Highcharts 雷达图径向轴标签定制指南:利用多Y轴实现数值标注  PHP URL参数传递与500错误调试指南  必由学官网入口 必由学教师登录入口  蛙漫正版漫画平台入口_蛙漫免费阅读全站漫画资源  sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件  Win10如何恢复误删的快捷方式_Win10重建常用软件快捷方式  J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程  MAC怎么让Dock栏只显示当前运行的应用_MAC终端命令实现极简Dock栏  Archive of Our Own官网直达 AO3最新可用地址一览  抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站  邮政快递单号查询入口 邮政快递物流信息在线查询入口  地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站  汽水音乐网页版使用入口_汽水音乐电脑版播放指南  PySpark中高效提取字符串右侧可变长度数字:使用regexp_extract  印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】  C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用  Win10自动更新怎么关闭 Win10永久关闭系统更新的两种方法【终极版】  如何在CSS中使用浮动制作导航栏_float实现水平菜单  css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染  电脑IP地址怎么查 查看本机IP地址的几种方法  Golang如何优雅处理error_Golang error处理最佳实践总结  淘宝网网页版登录入口 淘宝官方网页版快捷登录  为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法  cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法  漫蛙漫画官方主页入口 漫蛙MANWA网页直达访问链接  在J*a中如何隐藏复杂性_使用门面模式组织对象交互  MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具  zookeeper 都有哪些功能?  qq音乐在线播放入口_qq音乐电脑版登录链接  J*aScript类型检查_j*ascript代码规范  C++如何实现单例模式_C++设计模式之线程安全的单例写法  在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验  小米Civi 4录制视频过暗_小米Civi 4亮度优化  如何在复杂的电商平台中优雅地管理共享资源并确保正确重定向,使用spryker-shop/resource-share-page模块助你一臂之力  汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口  Surface怎么安装系统 微软Surface Pro U盘重装win11教程  腾讯视频怎么使用多账号家庭管理_腾讯视频家庭多账号统一管理与权限分配教程  星露谷物语官网入口 星露谷物语游戏官网入口  微信语音通话掉线如何解决 微信语音通话稳定优化方法  C#使用XPath查询节点时出错? 常见语法错误与调试技巧  我的世界官方游戏入口 我的世界官网平台直达链接  菜鸟取件码是什么怎么查 最全查询渠道汇总 

搜索