讲师中心 微信公众号
AI工具推荐 视频效率加速

JavaScript装饰器模式_高阶函数组合应用

轻墨小哥_6630

轻墨小哥_6630

发布时间:2025-11-26 18:37:02

|

234人浏览过

|

来源于php中文网

原创

装饰器模式是一种结构设计模式,它允许向对象添加新功能而不改变其原始结构。在JavaScript中,常通过高阶函数实现,即一个函数接收另一函数作为参数并返回增强后的新函数,从而动态扩展功能。这种模式不修改原函数逻辑,适用于日志记录、权限校验、性能监控等场景。例如,计时装饰器withTiming可包装目标函数,利用console.time记录执行时间,提升代码复用与灵活性。

javascript装饰器模式_高阶函数组合应用

装饰器模式在JavaScript中常通过高阶函数实现,它允许我们在不修改原函数逻辑的前提下,动态扩展其功能。这种组合方式让代码更灵活、可复用性更强,尤其适合处理日志、权限校验、性能监控等横切关注点。

什么是装饰器模式?

装饰器模式是一种结构设计模式,它允许向对象添加新功能,而不改变其原始结构。在JavaScript中,函数是一等公民,因此我们常用高阶函数来实现这一模式——即一个函数接收另一个函数作为参数,并返回增强后的新函数。

这种方式与面向对象语言中的@decorator语法不同,但在函数式编程中更为自然和广泛使用。

高阶函数实现装饰器

高阶函数是实现装饰器的核心机制。我们可以编写通用的包装函数,对目标函数进行拦截或增强。

立即学习“Java免费学习笔记(深入)”;

常见应用场景包括:
  • 记录函数执行时间
  • 缓存函数结果(记忆化)
  • 控制函数调用次数(节流/防抖)
  • 捕获异常并处理

例如,实现一个计时装饰器:

function withTiming(fn) {
  return function(...args) {
    console.time(fn.name);
    const result = fn.apply(this, args);
    console.timeEnd(fn.name);
    return result;
  };
}

function heavyCalc(n) {
  let sum = 0;
  for (let i = 0; i < n; i++) sum += i;
  return sum;
}

const timedCalc = withTiming(heavyCalc);
timedCalc(1000000); // 输出执行时间

多个装饰器的组合使用

通过函数组合,可以将多个装饰器叠加应用,形成管道式的增强流程。

Aria2 Json Rpc
Aria2 Json Rpc

通过 JSON‑RPC 2.0 与 aria2 下载管理器交互,使用自然语言命令管理下载、查询状态并控制任务。适用于 aria2、下载管理或种子操作。

下载

比如同时添加日志和缓存功能:

function withLog(fn) {
  return function(...args) {
    console.log(`调用 ${fn.name},参数:`, args);
    const result = fn.apply(this, args);
    console.log(`结果:`, result);
    return result;
  };
}

function memoize(fn) {
  const cache = new Map();
  return function(...args) {
    const key = JSON.stringify(args);
    if (cache.has(key)) {
      console.log(`缓存命中`);
      return cache.get(key);
    }
    const result = fn.apply(this, args);
    cache.set(key, result);
    return result;
  };
}

组合多个装饰器时,顺序很重要:

const enhancedFn = withLog(memoize(heavyCalc));
enhancedFn(1000);
enhancedFn(1000); // 命中缓存,但仍会输出日志

如果交换顺序,则缓存层可能先触发而跳过日志,需根据业务需求决定包裹顺序。

实际应用建议

在项目中使用装饰器模式时,注意以下几点:

  • 保持装饰器职责单一,便于复用和测试
  • 确保this指向正确,使用apply或call绑定上下文
  • 合理处理异步函数,返回Promise并在合适时机进行拦截
  • 避免过度包装导致调试困难,必要时提供开关机制

对于异步函数,装饰器也需返回异步逻辑:

function withErrorCatch(fn) {
  return async function(...args) {
    try {
      return await fn.apply(this, args);
    } catch (err) {
      console.error(`调用失败:`, err.message);
      throw err;
    }
  };
}

基本上就这些。装饰器模式结合高阶函数,能极大提升代码的模块化程度,让核心逻辑更专注,增强逻辑更统一。不复杂但容易忽略细节,比如参数透传和上下文绑定,写的时候多留意就行。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

更多
go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

5455

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

302

2025.11.27

C++ 面向对象编程与设计模式实践
C++ 面向对象编程与设计模式实践

本专题整合了 C++ 面向对象编程的核心机制,涵盖类的定义与访问控制、构造函数与析构函数、拷贝语义与移动语义、继承与虚函数多态、抽象类与接口、运算符重载、友元函数等关键知识点,同时结合单例模式、工厂模式、观察者模式、策略模式等常用设计模式的 C++ 实现,帮助开发者写出结构清晰、易于维护的面向对象代码。

304

2026.04.09

Java 面向对象与核心编程机制
Java 面向对象与核心编程机制

系统讲解 Java 面向对象编程的核心知识体系,涵盖类的定义与封装、构造方法与 this/super 关键字、继承与方法重写、多态与向上向下转型、抽象类与接口的区别与设计原则、异常处理机制(try-catch-finally / 自定义异常)、泛型的类型参数与通配符、集合框架(List/Set/Map)的使用与遍历方式,帮助开发者全面掌握 Java 程序设计的核心机制与面向对象思维。

203

2026.04.17

console接口是干嘛的
console接口是干嘛的

console接口是一种用于在计算机命令行或浏览器开发工具中输出信息的工具,提供了一种简单的方式来记录和查看应用程序的输出结果和调试信息。本专题为大家提供console接口相关的各种文章、以及下载和课程。

796

2023.08.08

console.log是什么
console.log是什么

console.log 是 javascript 函数,用于在浏览器控制台中输出信息,便于调试和故障排除。想了解更多console.log的相关内容,可以阅读本专题下面的文章。

5543

2024.05.29

promise的用法
promise的用法

“promise” 是一种用于处理异步操作的编程概念,它可以用来表示一个异步操作的最终结果。Promise 对象有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。Promise的用法主要包括构造函数、实例方法(then、catch、finally)和状态转换。

4120

2023.10.12

html文本框类型介绍
html文本框类型介绍

html文本框类型有单行文本框、密码文本框、数字文本框、日期文本框、时间文本框、文件上传文本框、多行文本框等等。详细介绍:1、单行文本框是最常见的文本框类型,用于接受单行文本输入,用户可以在文本框中输入任意文本,例如用户名、密码、电子邮件地址等;2、密码文本框用于接受密码输入,用户在输入密码时,文本框中的内容会被隐藏,以保护用户的隐私;3、数字文本框等等。

3343

2023.10.12

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

0

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel框架内核源码分析
Laravel框架内核源码分析

共26课时 | 4.2万人学习

WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn