0

0

什么是 JavaScript 的装饰器在元编程中的应用,它们如何修改类的行为?

夢幻星辰

夢幻星辰

发布时间:2025-09-26 12:23:01

|

1016人浏览过

|

来源于php中文网

原创

装饰器是一种元编程特性,通过@语法修饰类或成员,实现行为扩展。它分为类、方法、属性等类型,可添加静态属性、日志记录、权限控制等功能,如@addversion为类添加version属性,@log拦截方法调用输出参数信息,广泛应用于依赖注入、缓存、序列化等场景,提升代码复用与维护性,但仅适用于类上下文,不支持函数表达式或箭头函数,目前处于提案stage 3阶段,typescript和构建工具中已可用。

什么是 javascript 的装饰器在元编程中的应用,它们如何修改类的行为?

JavaScript 的装饰器是一种用于元编程的特性,允许你在定义类或类成员时修改它们的行为。装饰器本质上是一个函数,通过在类或方法前使用 @ 语法来应用,能够在不改变原始代码的情况下增强或调整功能。

装饰器的基本语法和结构

装饰器可以应用于类、方法、访问器、属性或参数。它接收目标对象、成员名和属性描述符等参数,并可返回一个新的描述符或修改原有行为。

常见的装饰器形式包括:
  • 类装饰器: 接收类的构造函数作为参数,可用于扩展类的功能或替换类定义。
  • 方法装饰器: 可拦截方法调用,实现日志记录、权限检查或性能监控。
  • 属性装饰器: 用于标记或初始化类的某个属性。

例如,一个简单的类装饰器可以自动为类添加静态属性:

function addVersion(target) {
  target.version = "1.0";
}

@addVersion
class MyApp {}
console.log(MyApp.version); // 输出 "1.0"

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

Text-To-Song
Text-To-Song

免费的实时语音转换器和调制器

下载

如何通过装饰器修改类的行为

装饰器可以在运行时动态改变类的结构或逻辑。比如,你可以使用方法装饰器来包裹原始方法,实现调用前后的额外逻辑。

function log(target, name, descriptor) {
  const original = descriptor.value;
  descriptor.value = function (...args) {
    console.log(`调用方法 ${name} 参数:`, args);
    return original.apply(this, args);
  };
  return descriptor;
}

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

new Calculator().add(2, 3); // 控制台输出调用信息

装饰器在实际开发中的应用场景

装饰器广泛用于框架和库中,提升代码的可读性和复用性。

  • 依赖注入: 标记类需要的服务,在运行时自动注入实例。
  • 权限控制: 在方法执行前检查用户角色,决定是否放行。
  • 缓存机制: 对结果稳定的函数添加缓存逻辑,避免重复计算。
  • 序列化支持: 通过属性装饰器标记哪些字段需要被序列化。

基本上就这些。装饰器提供了一种声明式的方式来扩展类的能力,让关注点分离更清晰,特别适合处理横切关注点。虽然目前 JavaScript 装饰器仍处于提案阶段(Stage 3),但在 TypeScript 和部分构建工具中已可使用。正确使用能显著提升代码组织方式和维护效率。不复杂但容易忽略的是,装饰器不能用于函数表达式或箭头函数这类非类上下文。

热门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

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

562

2023.09.20

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

850

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

30

2025.12.06

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

850

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

30

2025.12.06

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

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

420

2023.08.08

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

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

3

2026.03.11

热门下载

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

精品课程

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

共58课时 | 5.9万人学习

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号