J*ascript如何实现装饰器_如何动态扩展功能?


J*aScript装饰器是Stage 3提案,作为语法糖在类定义阶段动态增强类、方法等;支持类、方法、属性装饰器,常用于日志、错误重试、权限控制等横切关注点。

javascript如何实现装饰器_如何动态扩展功能?

J*aScript 中的装饰器(Decorator)目前仍是 Stage 3 提案,尚未正式进入标准,但可通过 Babel(配合 @babel/plugin-proposal-decorators)或 TypeScript 启用。它本质是一种语法糖,用于在类、方法、访问器或属性声明时,以声明式方式“包裹”或“增强”目标行为——也就是动态扩展功能的核心机制。

装饰器的基本形态:函数接收目标信息

装饰器必须是函数,它会在定义时被调用,并接收不同参数,取决于装饰位置:

  • 类装饰器:接收构造函数(target
  • 方法/访问器装饰器:接收类原型(target)、方法名(propertyKey)、属性描述符(descriptor
  • 属性装饰器(仅 TS 或 Babel 模拟):接收类构造函数和属性名(不直接操作 descriptor,需配合 Object.defineProperty 或元数据实现)

关键点:装饰器执行时机是**类定义阶段**(非实例化时),因此适合做静态增强、元数据收集、方法重写等。

用方法装饰器实现日志与性能监控

这是最典型的动态扩展场景:不修改原方法逻辑,只在外层添加横切关注点。

function log(target, propertyKey, descriptor) {
  const original = descriptor.value;
  descriptor.value = function(...args) {
    console.log(`[LOG] 调用 ${propertyKey},参数:`, args);
    const start = performance.now();
    const result = original.apply(this, args);
    const end = performance.now();
    console.log(`[PERF] ${propertyKey} 执行耗时:${end - start}ms`);
    return result;
  };
}

使用方式:

class Calculator {
  @log
  add(a, b) {
    return a + b;
  }
}

调用 new Calculator().add(2, 3) 会自动打印日志和耗时——功能动态注入,原方法零侵入。

PHP Apache和MySQL 网页开发初步 PHP Apache和MySQL 网页开发初步

本书全面介绍PHP脚本语言和MySOL数据库这两种目前最流行的开源软件,主要包括PHP和MySQL基本概念、PHP扩展与应用库、日期和时间功能、PHP数据对象扩展、PHP的mysqli扩展、MySQL 5的存储例程、解发器和视图等。本书帮助读者学习PHP编程语言和MySQL数据库服务器的最佳实践,了解如何创建数据库驱动的动态Web应用程序。

PHP Apache和MySQL 网页开发初步 398 查看详情 PHP Apache和MySQL 网页开发初步

用类装饰器统一处理错误与重试

适用于需要为整组方法添加容错能力的场景,比如 API 客户端类。

function withErrorBoundary(retry = 2) {
  return function(target) {
    Object.getOwnPropertyNames(target.prototype).forEach(key => {
      const desc = Object.getOwnPropertyDescriptor(target.prototype, key);
      if (desc && typeof desc.value === 'function' && !key.startsWith('_')) {
        const original = desc.value;
        desc.value = async function(...args) {
          for (let i = 0; i <= retry; i++) {
            try {
              return await original.apply(this, args);
            } catch (err) {
              if (i === retry) throw err;
              console.warn(`第 ${i + 1} 次失败,${1000 * (i + 1)}ms 后重试...`);
              await new Promise(r => setTimeout(r, 1000 * (i + 1)));
            }
          }
        };
        Object.defineProperty(target.prototype, key, desc);
      }
    });
  };
}

这样,只需 @withErrorBoundary(1) 就能让类中所有公开方法具备自动重试能力。

结合元数据实现权限控制(需 Reflect Metadata)

要真正实现“动态扩展”,常需配合 reflect-metadata 存储配置,再在运行时读取并决策。

import 'reflect-metadata';
<p>function requireRole(role) {
return function(target, propertyKey, descriptor) {
Reflect.defineMetadata('role:required', role, target, propertyKey);
const original = descriptor.value;
descriptor.value = function(...args) {
const userRole = this.currentUser?.role || 'guest';
const required = Reflect.getMetadata('role:required', target, propertyKey);
if (userRole !== required) {
throw new Error(<code>权限不足:需要 ${required} 角色</code>);
}
return original.apply(this, args);
};
};
}</p><p>// 使用
class AdminPanel {
@requireRole('admin')
deleteUser(id) { /<em> ... </em>/ }
}

权限规则在装饰时声明,执行时动态校验——逻辑解耦,易于维护和替换策略。

以上就是J*ascript如何实现装饰器_如何动态扩展功能?的详细内容,更多请关注其它相关文章!


# 有何区别  # 上海网站建站建设  # 百色独特seo策略  # 网站结构优化文章  # 推广的网站  # 江北的网站建设公司  # 上海网站建设合优  # 健康险如何营销推广  # seo网站推广方法有哪些种类  # seo佳肴  # 荆门seo优化费用低  # 横切  # 是一种  # javascript  # 这是  # 如何用  # 怎么做  # 有何  # 本书  # 如何实现  # 重试  # red  # app  # typescript  # java 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 学习通网页版课程打不开_课程无法访问时的解决方法  键盘声音异常怎么回事_键盘异响怎么处理  CDR如何复制交互式填充色  韩剧圈正版官网入口_韩剧圈官方指定登录  批改网官网首页登录 批改网学生用户登录入口  Python对象引用与属性赋值:理解链表中的行为  Sublime怎么自动添加CSS前缀_Sublime安装Autoprefixer插件  铁路12306官网入口 铁路12306中国铁路官网登录首页  Win10共享文件夹设置方法 Win10局域网文件共享全攻略【教程】  PHP 4 函数中引用参数的默认值限制与解决方案  传统曲艺莲花落的表演形式是  天天漫画2025最新入口 天天漫画永久有效登录入口  店铺如何做视频号推广?做视频号推广有用吗?  晨报|开发商暗示《空洞骑士:丝之歌》DLC开发中 《合金装备4》有望重制  精通VS Code多光标编辑以实现闪电般快速的修改  使用VS Code调试Python代码:从入门到精通  J*aScript与CSS动画:实现平滑顺序淡入淡出效果并解决显示冲突  抖音网页版官方链接 抖音网页版官网链接入口  Excel如何设置动态下拉菜单_Excel表格下拉选项快速方法  c++如何使用std::thread::join和detach_c++线程生命周期管理  C++如何实现单例模式_C++线程安全的单例模式写法  Lar*el 关联查询:同时筛选父表与子表数据的高效策略  跨语言测试实践:使用Python Selenium测试现有J*a Web项目  J*a实现任务清单管理_集合框架综合入门练手  智慧职教mooc平台登录网址 智慧职教mooc官网直达  CSS如何在页面中引入重置样式_使用Normalize.css或Reset.css统一浏览器默认样式  电脑开不了机怎么办 电脑无法开机的解决方法  快手网页版官方访问 快手网页版页面在线打开  获取WooCommerce产品在后台编辑页面的分类ID  知乎APP怎么查看自己被邀请的问题_知乎APP邀请回答记录查看与参与方法  word邮件合并怎么插入个性化图片_Word邮件合并插入个性化图片方法  抖音号已注销怎么解绑企业认证?不解绑企业认证会怎样?  NumPy 高性能技巧:基于多列条件查找最近邻行索引的向量化实现  纯CSS实现滚动时动态时间轴线条颜色填充效果  键盘测试软件哪个好_键盘故障检测工具推荐  苹果手机如何清理系统缓存数据 iPhone非越狱清理垃圾文件的技巧【系统优化】  mysql如何回滚事务_mysql ROLLBACK事务回滚方法  《i莞家》修改昵称方法  夸克浏览器资源嗅探怎么用 夸克浏览器网页资源下载技巧【教程】  汽水音乐在线入口 汽水音乐网页端官方页面快速打开  word文档行距怎么调?word文档调行距的操作步骤  苹果手机聊天记录删除了如何恢复  win11资源管理器标签页怎么用 Win11文件管理器多标签高效操作【新功能】  《合金装备4》有望推出重制版!制作人发话了  店铺如何关联视频号推广?视频号推广有什么用?  VS Code源代码管理(SCM)视图的进阶使用技巧  如何在CSS中设置背景图像:一个全面指南  TikTok笔记文字无法编辑如何解决 TikTok笔记文字编辑优化方法  怎样设置开机后自动运行某个程序_Windows启动文件夹与任务计划【自动化】  Excel如何快速合并单元格内容_Excel文本合并与函数操作技巧 

 2025-12-18

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.