0

0

JS函数如何定义函数装饰器_JS函数装饰器定义与功能增强方法

爱谁谁

爱谁谁

发布时间:2025-11-08 18:49:02

|

501人浏览过

|

来源于php中文网

原创

函数装饰器是接收函数并返回新函数的高阶函数,用于扩展功能而不修改原函数。例如logDecorator添加日志,retryDecorator支持配置重试次数,适用于日志、监控等场景。

js函数如何定义函数装饰器_js函数装饰器定义与功能增强方法

JavaScript 中虽然没有像 Python 那样的原生装饰器语法,但可以通过高阶函数模拟实现函数装饰器,用于增强或修改函数行为。这种模式在实际开发中常用于日志记录、性能监控、权限校验等场景。

什么是函数装饰器

函数装饰器本质上是一个函数,它接收另一个函数作为参数,并返回一个新函数。这个新函数通常会扩展原始函数的功能,比如添加前置逻辑、后置逻辑,或改变调用方式。

装饰器不修改原函数代码,而是通过包装实现功能增强,符合“开闭原则”。

基本的装饰器实现方式

使用高阶函数定义装饰器是最常见的方式。以下是一个简单的例子:

function logDecorator(fn) {
  return function(...args) {
    console.log(`调用函数: ${fn.name}, 参数:`, args);
    const result = fn.apply(this, args);
    console.log(`函数返回值:`, result);
    return result;
  };
}

// 使用装饰器
function add(a, b) {
  return a + b;
}

const loggedAdd = logDecorator(add);
loggedAdd(2, 3); // 输出调用和返回信息

在这个例子中,logDecorator 是一个装饰器,它包裹了原函数并添加了日志功能。

带参数的装饰器

有时需要为装饰器传入配置项,可以再封装一层函数:

酷兔AI论文
酷兔AI论文

专业原创高质量、低查重,免费论文大纲,在线AI生成原创论文,AI辅助生成论文的神器!

下载
function retryDecorator(times) {
  return function (fn) {
    return function (...args) {
      let attempts = 0;
      while (attempts < times) {
        try {
          return fn.apply(this, args);
        } catch (error) {
          attempts++;
          if (attempts >= times) throw error;
          console.log(`重试第 ${attempts} 次...`);
        }
      }
    };
  };
}

// 使用
const riskyOperation = retryDecorator(3)(function () {
  if (Math.random() < 0.7) throw new Error("失败!");
  return "成功!";
});

这样就能灵活控制重试次数,适用于网络请求等不稳定操作。

利用 ES6 Proxy 实现更复杂的装饰

对于对象方法的批量装饰,可以用 Proxy 拦截调用过程:

function createLoggedProxy(obj) {
  return new Proxy(obj, {
    get(target, prop) {
      const value = target[prop];
      if (typeof value === 'function') {
        return function (...args) {
          console.log(`调用方法: ${prop}, 参数:`, args);
          const result = value.apply(target, args);
          console.log(`方法返回:`, result);
          return result;
        };
      }
      return value;
    }
  });
}

const api = {
  fetchUser(id) { return `用户${id}`; }
};

const loggedApi = createLoggedProxy(api);
loggedApi.fetchUser(123);

这种方式适合对整个对象的方法进行统一增强,无需逐个包装。

基本上就这些。JS 函数装饰器虽非语言原生特性,但凭借其灵活性,能有效提升代码复用性和可维护性。关键在于理解高阶函数与闭包机制,合理封装通用逻辑。不复杂但容易忽略细节,比如 this 指向和参数传递要处理得当。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

769

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

661

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

764

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

639

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1325

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

549

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

709

2023.08.11

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.21

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号