全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-690-7320

J*aScript装饰器_元数据编程实战

装饰器与元数据编程通过在类、方法等结构上附加行为实现代码复用,结合reflect-metadata库可在运行时读写元数据,常用于依赖注入等场景。

javascript装饰器_元数据编程实战

J*aScript 装饰器与元数据编程是现代前端开发中越来越重要的技术,尤其在 TypeScript 和框架如 Angular、NestJS 中广泛应用。它们允许你在类、方法、属性等代码结构上附加额外行为或信息,实现关注点分离和代码复用。下面通过实战角度带你掌握装饰器与元数据的结合使用。

装饰器基础:理解四种常见装饰器类型

装饰器本质上是一个函数,它会在目标被定义时执行,并接收目标的元信息作为参数。TypeScript 支持以下四种装饰器:

  • 类装饰器:作用于类构造函数,可用于修改类的行为或替换类定义。
  • 方法装饰器:作用于类的方法描述符,可用于拦截调用、添加日志或权限控制。
  • 属性装饰器:作用于类的属性声明,常用于依赖注入或标记字段用途。
  • 参数装饰器:作用于方法参数,配合元数据可提取参数类型或用途。

启用装饰器需在 tsconfig.json 中开启相关配置:

{
  "experimentalDecorators": true,
  "emitDecoratorMetadata": true
}

使用 reflect-metadata 提供运行时元数据支持

原生 J*aScript 不保留类型信息到运行时,而 reflect-metadata 库填补了这一空白。通过它,你可以在装饰器中存储和读取元数据。

安装依赖:

npm install reflect-metadata --s*e

在入口文件顶部引入:

import 'reflect-metadata';

示例:为方法添加元数据标签:

function Log(target: any, propertyName: string, descriptor: PropertyDescriptor) {
  const originalMethod = descriptor.value;
  descriptor.value = function (...args: any[]) {
    console.log(`Calling "${propertyName}" with arguments:`, args);
    return originalMethod.apply(this, args);
  };

  // 存储元数据
  Reflect.defineMetadata('custom:logged', true, target, propertyName);
}

实战:构建简单的依赖注入容器

利用装饰器和元数据,可以实现一个轻量级依赖注入系统。

来画数字人直播 来画数字人|直播|

来画数字人自动化|直播|,无需请真人主播,即可实现24小时|直播|,无缝衔接各大|直播|平台。

来画数字人直播 57 查看详情 来画数字人直播

定义 @Injectable 装饰器标记可注入类:

function Injectable() {
  return function (constructor: Function) {
    Reflect.defineMetadata('di:injectable', true, constructor);
  };
}

定义 @Inject 装饰器标记构造函数参数:

function Inject(token: any) {
  return function (target: any, propertyKey: string | symbol, parameterIndex: number) {
    let existingTokens = Reflect.getMetadata('di:tokens', target) || [];
    existingTokens[parameterIndex] = token;
    Reflect.defineMetadata('di:tokens', existingTokens, target);
  };
}

简单容器实现:

class Container {
  private instances = new Map();

  resolve<T>(token: Function): T {
    if (this.instances.has(token)) {
      return this.instances.get(token);
    }

    const tokens = Reflect.getMetadata('di:tokens', token) || [];
    const dependencies = tokens.map(dep => this.resolve(dep));
    
    const instance = new token(...dependencies);
    this.instances.set(token, instance);
    return instance;
  }
}

使用方式:

@Injectable()
class Logger {
  log(msg: string) { console.log(msg); }
}

@Injectable()
class Service {
  constructor(@Inject(Logger) private logger: Logger) {}

  run() { this.logger.log('Service running'); }
}

注意事项与兼容性

目前装饰器语法仍在提案阶段(Stage 3),不同版本间可能存在差异。TypeScript 默认使用旧版装饰器模型,建议在 tsconfig.json 中明确设置:

"target": "ES2025",
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"useDefineForClassFields": false

新版装饰器(2025+)语义更清晰,但生态适配仍在进行中。当前 NestJS 等框架仍基于旧模型运作。

基本上就这些。掌握装饰器与元数据组合,能让你写出更具扩展性和可维护性的代码,特别是在构建框架或复杂应用架构时非常有用。

以上就是J*aScript装饰器_元数据编程实战的详细内容,更多请关注其它相关文章!


# javascript  # java  # js  # 元数据  # 复用  # 怎么进行精准营销推广呢  # 是一个  # 这一  # 是在  # 沈阳祥云平台网站建设  # seo日志工具  # 惠州网站建设策划书  # 吉安互联网seo  # 推荐seo优化价格优惠  # 完美的网站推广  # 抖音APP大数据营销推广方案  # 罗湖区网站建设效果  # 西安高端网站建设电话  # 如何实现  # 如何用  # 错误信息  # 四种  # 自定义  # 作用于  # 代码  # ai  # 前端开发  # app  # npm  # typescript  # json  # 前端 


相关文章: Python中高效访问嵌套字典与列表中的键值对  如何使用Node.js csv 包按条件移除含空字段的CSV记录  CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题  印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】  word邮件合并后日期格式不对怎么改_Word邮件合并日期格式修改方法  如何修改开机登录密码_Windows账户安全设置超详细教程【必学】  AO3官方在线访问地址 Archive of Our Own最新镜像合集  jQuery Mask 插件中实现电话号码固定前导零的教程  使用PHP DOM解析器高效提取HTML中特定标题及其紧邻段落  解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException  如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置  html怎么运行外部js文件中的函数_运html外js文件函数法【技巧】  拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧  b站怎么看视频的弹幕数量_b站弹幕数量查看方法  vivo浏览器怎么扫描二维码 vivo浏览器内置扫一扫功能使用方法  深入理解J*a链表中的IPosition接口与使用  如何使用纯J*aScript判断Input元素是否在特定类容器内  mc.js游戏直达 mc.js网页免下载版本秒进地址  解决macOS上安装pyhdf时‘hdf.h’文件缺失的编译错误  深入理解J*a编译器的兼容性选项:从-source到--release  UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】  PHP表单提交消息延迟显示:Post-Redirect-Get模式深度解析与实践  html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】  在React函数组件中利用原生HTML5进行邮箱地址验证  J*aScript数组对象转换:按指定键分组与值收集  J*aScript中localStorage数据的获取、清洗与格式化教程  excel怎么制作工资条 excel快速生成工资条的方法  狙击外星人小游戏开始_狙击外星人小游戏立即开始  小红书怎么解除第三方平台绑定_小红书多平台登录解绑方法介绍  最新韩小圈网页版登录入口_官网在线观看官方链接  解决Django多数据库/多Schema环境下外键迁移问题  12306选座怎么选到临时改签座_12306改签选座策略与步骤  windows10怎么关闭系统提示音_windows10彻底静音设置方法  b站怎么取消点赞_b站点赞取消操作方法  微信语音通话掉线如何解决 微信语音通话稳定优化方法  PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符  yandex入口引擎手机版 yandex安卓版下载入口  Python模块化编程:有效管理依赖与避免循环引用  在VS Code中配置和运行Dart程序的完整步骤  php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】  淘宝支付提示失败如何解决 淘宝支付流程优化方法  顺丰快递查单号物流信息 顺丰快递小程序查询入口  字由网在线版登录地址 字由网网页版安全入口  qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程  必由学登录入口 必由学官方网站在线访问链接  PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】  微信商城在哪里打开【步骤】  ACG动漫视频网入口 ACG动漫*免费正版观看地址  如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】  高德地图公交到站提醒失败如何解决 高德提醒权限设置 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。