0

0

javascript中的装饰器是什么_如何使用它增强函数功能

幻影之瞳

幻影之瞳

发布时间:2025-12-25 18:04:44

|

407人浏览过

|

来源于php中文网

原创

装饰器是javascript中用于增强函数、类及成员行为的语法糖,本质为接收目标对象等参数并返回新描述符的高阶函数;需通过typescript或babel等工具链启用,支持日志、防抖、权限校验等场景,多个装饰器按从下到上、从右到左顺序执行。

javascript中的装饰器是什么_如何使用它增强函数功能

装饰器(Decorator)是 JavaScript 中一种用于修改或增强函数、类及其成员(如方法、属性)行为的语法特性,目前处于 TC39 第四阶段提案(已进入 ECMAScript 标准草案),在 TypeScript 和支持实验性语法的现代 JavaScript 环境(如 Babel、ESBuild、Vite)中可直接使用。

装饰器本质:高阶函数的语法糖

装饰器本质上是一个接收目标对象、属性名、描述符等参数,并返回新描述符(或修改原描述符)的函数。它不是运行时魔法,而是编译期(或转译期)介入对象定义过程的机制。

  • 函数装饰器作用于函数声明或导出表达式,常用于包装执行逻辑(如日志、防抖、权限校验)
  • 类装饰器作用于整个类构造器,可用于注册、元数据注入、子类自动增强等
  • 方法/访问器/属性装饰器作用于类内部成员,可劫持调用、拦截赋值、添加元数据

启用装饰器需配置环境

原生 JavaScript 浏览器暂不支持装饰器语法(截至 2024 年底),需借助工具链:

  • TypeScript:在 tsconfig.json 中开启 "experimentalDecorators": true"emitDecoratorMetadata": true
  • Babel:安装 @babel/plugin-proposal-decorators,插件配置启用 legacy: false(符合标准提案)
  • Vite / Next.js / Remix:通常默认支持,检查文档确认装饰器模式(legacy2023-11

常见实用装饰器写法

以方法装饰器为例,实现一个简单的日志记录装饰器:

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

What-the-Diff
What-the-Diff

检查请求差异,自动生成更改描述

下载
function log(target, propertyKey, descriptor) {
  const originalMethod = descriptor.value;
  descriptor.value = function(...args) {
    console.log(`[LOG] 调用 ${String(propertyKey)},参数:`, args);
    const result = originalMethod.apply(this, args);
    console.log(`[LOG] ${String(propertyKey)} 返回:`, result);
    return result;
  };
}

使用方式:

class Calculator {
  @log
  add(a, b) {
    return a + b;
  }
}
<p>const calc = new Calculator();
calc.add(2, 3); // 控制台输出调用与返回信息

其他高频场景:

  • @debounce(300):防抖方法调用
  • @readonly:冻结方法不可重写(设置 descriptor.writable = false
  • @auth('admin'):运行前校验用户角色
  • @memoize:自动缓存函数结果(基于参数序列化)

装饰器组合与顺序

多个装饰器可叠加使用,执行顺序为**从下到上、从右到左**(类似函数组合):

class User {
  @log
  @debounce(200)
  @throttle(1000)
  save() { /* ... */ }
}

等价于:log(debounce(throttle(save)))。注意:装饰器本身不改变原始方法,而是通过修改描述符间接影响行为,因此顺序直接影响增强逻辑的包裹层次。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

47

2026.02.13

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

191

2026.02.25

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

455

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

334

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

530

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

576

2023.07.28

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

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

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