新闻中心

J*aScript装饰器模式实现

2025-10-23
浏览次数:
返回列表
装饰器模式通过包装对象动态扩展功能而不修改其结构。J*aScript凭借原型和函数式特性,支持函数装饰(如日志、性能监控)、类/方法装饰(如只读、参数校验)及手动对象装饰,实现关注点分离与代码复用。

javascript装饰器模式实现

装饰器模式允许你动态地给对象添加新功能,而不改变其原始结构。在 J*aScript 中,这种模式特别灵活,得益于其原型机制和函数式特性。通过装饰器,可以在不修改原对象代码的前提下,扩展方法或行为。

基本概念与使用场景

装饰器模式的核心是“包装”——用一个新的对象包装原有对象,在保留原有接口的同时增加新逻辑。常见用途包括:

  • 日志记录:调用方法前后输出信息
  • 权限校验:执行前检查用户权限
  • 缓存处理:对结果进行缓存避免重复计算
  • 参数校验或格式化

函数级别的装饰器实现

J*aScript 中最简单的装饰器形式是对函数进行包装。例如,为一个函数添加执行时间日志:

function timer(fn) {
  return function(...args) {
    console.log(`开始执行 ${fn.name}`);
    const start = Date.now();
    const result = fn.apply(this, args);
    const end = Date.now();
    console.log(`结束执行 ${fn.name},耗时 ${end - start}ms`);
    return result;
  }
}

function fetchData() {
  // 模拟耗时操作
  for (let i = 0; i   return "数据加载完成";
}

const timedFetchData = timer(fetchData);
timedFetchData(); // 输出执行时间

类与方法装饰器(ES 装饰器提案)

现代 J*aScript(处于 Stage 3 阶段)支持语法级装饰器,可用于类、属性、方法等。需借助 Babel 或 TypeScript 启用。

以方法装饰器为例,实现一个只读控制:

Shoping购物网源码 Shoping购物网源码

该系统采用多层模式开发,这个网站主要展示女装的经营,更易于网站的扩展和后期的维护,同时也根据常用的SQL注入手段做出相应的防御以提高网站的安全性,本网站实现了购物车,产品订单管理,产品展示,等等,后台实现了动态权限的管理,客户管理,订单管理以及商品管理等等,前台页面设计精致,后台便于操作等。实现了无限子类的添加,实现了动态权限的管理,支持一下一个人做的辛苦

Shoping购物网源码 0 查看详情 Shoping购物网源码 function readonly(target, name, descriptor) {
  descriptor.writable = false;
  return descriptor;
}

class UserService {
  @readonly
  getUser(id) {
    return 用户 ${id};
  }
}

const service = new UserService();
service.getUser = () => "被篡改"; // 无效,原方法不可写

自定义装饰器也可带参数,比如创建一个日志装饰器:

function log(message) {
  return function(target, name, descriptor) {
    const original = descriptor.value;
    descriptor.value = function(...args) {
      console.log(`${message} 开始`);
      const result = original.apply(this, args);
      console.log(`${message} 完成`);
      return result;
    };
    return descriptor;
  };
}

class API {
  @log("获取用户")
  fetchUser() {
    return { id: 1, name: "Alice" };
  }
}

手动实现对象装饰

如果不想依赖实验性语法,可以直接通过对象扩展模拟装饰器:

function decorate(obj, methods) {
  Object.keys(methods).forEach(key => {
    const original = obj[key];
    obj[key] = function(...args) {
      return methods[key].call(this, original.bind(this), ...args);
    };
  });
}

const user = {
  login(name) {
    console.log(${name} 登录成功);
    return true;
  }
};

decorate(user, {
  login(original, name) {
    console.log("记录登录日志...");
    return original(name);
  }
});

user.login("Bob"); // 先输出日志,再执行原方法

基本上就这些。装饰器模式让代码更模块化,关注点分离清晰。虽然原生装饰器还在推进中,但函数包装和高阶函数的方式在 JS 中早已广泛应用。理解其思想比语法更重要。不复杂但容易忽略细节,比如 this 指向和 descriptor 的正确返回。

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


# javascript  # java  # 装饰器模式  # 南平seo软件  # 潍坊线上seo平台官网  # 济南抖音关键词搜索排名  # 山东关键词排名推广软件  # 刷移动关键词排名首页  # 企业新品推广营销策略  # 大运村建设信息公开网站  # seo怎么取胜  # 泉州德化推广网站建设  # 黄浦区谷歌网站优化方案  # 子类  # 还在  # 订单管理  # 复用  # 如何实现  # 如何处理  # 而不  # 执行时间  # 实现了  # 购物网  # 代码复用  # app  # typescript  # js 


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


相关推荐: win11怎么查看应用耗电情况 Win11电池设置查看应用能耗排行榜【优化】  天猫2025双十一0点秒杀攻略 天猫爆款抢购时间  PrimeNG Sidebar背景色自定义指南:CSS覆盖与主题化实践  2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示  NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰  微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法  一加 14R 快充无反应_一加 14R 充电优化  Golang指针如何与map组合使用_Golang map指针组合实践  Golang如何实现Web接口签名验证_Golang Web接口签名校验开发方法  windows10怎么关闭系统提示音_windows10彻底静音设置方法  微信商城在哪里打开【步骤】  抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站  css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间  Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达  yy漫画网页版官方入口_yy漫画官网登录页面链接  使用Python高效删除Word宏并转换DOCM为DOCX格式  怎么在mac上运行html代码_mac运行html代码方法【指南】  在VS Code中配置和运行Dart程序的完整步骤  lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法  智慧团建扫码登录入口 智慧团建扫码登录入口官网版​  mysql备份恢复性能优化_mysql备份恢复性能优化方法  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战  Android Studio计算器C键功能异常排查与修复教程  三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升  2306选座时如何选靠窗位置_12306选座靠窗座位查看方法解析  J*a TimerTask中HashMap意外清空的深层原因与解决方案  Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略  电脑屏幕颜色不舒服怎么办_Windows夜间模式与色彩校准教程【护眼技巧】  移动端XML文件怎么转换成Excel 手机和平板上的解决方案  如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式  FullCalendar 自定义按钮样式定制指南  AO3网页版最新入口合集 Archive of Our Own在线访问指南  b站怎么取消点赞_b站点赞取消操作方法  微信客户端如何收红包_微信客户端接收红包使用教程  J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题  《噬血代码2》新预告片发布 展示游戏剧情  提升Kafka消费者健壮性:会话超时处理与消息处理语义  汽车之家官方网站官网入口_汽车之家网页版直接进入  抖音网页版快捷访问 抖音网页版网页版入口操作教程  优化HTML表单样式:解决输入框焦点跳动与元素间距问题  QQ官网正版登录链接 QQ在线登录入口最新  AO3官方在线访问地址 Archive of Our Own最新镜像合集  押井守高度称赞《辐射4》:玩了八年都停不下来!  css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染  夸克浏览器网页版最新地址 夸克浏览器官方入口合集  解决Tabulator日期时间排序问题的专业指南  QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网  QQ网页版官方账号入口 QQ网页版网页版登录指南  腾讯视频怎么使用多账号家庭管理_腾讯视频家庭多账号统一管理与权限分配教程 

搜索