0

0

什么是javascript装饰器_它如何扩展类和方法的特性

狼影

狼影

发布时间:2026-01-09 19:21:27

|

666人浏览过

|

来源于php中文网

原创

javascript装饰器是stage 3实验性语法,用于声明时修改类/方法/属性行为,需经babel或typescript转译才能运行;本质是接收target、propertykey、descriptor等参数的函数,通过修改descriptor实现元编程。

什么是javascript装饰器_它如何扩展类和方法的特性

JavaScript 装饰器 是一种实验性语法(目前处于 Stage 3 提案),用于在声明时**修改类、方法、访问器、属性或参数的行为**。它本身不改变 JavaScript 的运行时语义,而是通过编译工具(如 Babel、TypeScript)转译为可执行代码,实现“元编程”式的逻辑注入。 你不能直接在浏览器中开箱即用 @decorator 语法——除非你明确配置了转译流程。这是最容易被忽略的前提。

装饰器本质是函数,不是语法糖

一个装饰器就是一个接受目标对象、成员名、属性描述符(或类构造器)作为参数的函数:

function readonly(target, propertyKey, descriptor) {
  descriptor.writable = false;
  return descriptor;
}

class User {
  @readonly
  name = 'Alice';
}

上面的 @readonly 实际会被转译为类似 Object.defineProperty(...) 的调用。关键点:

  • target 是类的原型(对实例方法)或构造函数(对静态方法/类本身)
  • descriptor 可以被修改后返回,从而影响属性行为(如 writableenumerablevalueget/set
  • 装饰器函数必须有返回值:对方法/属性装饰器,通常要返回修改后的 descriptor;对类装饰器,可返回新构造函数(但会丢失 instanceof 关系)

TypeScript 和 Babel 对装饰器的支持差异

TypeScript 默认启用的是旧版(ES2015-style)装饰器,与当前提案不兼容;Babel 7.22+ 默认使用新版(legacy: false)。两者行为不同,容易导致:

  • 方法装饰器中 descriptor.value 在旧版里是原始函数,在新版里可能为 undefined(需用 initializer
  • TypeScript 的 experimentalDecorators 编译选项开启后,仅做类型检查,不生成运行时逻辑 —— 真正生效还得靠 Babel 或 tsc 的 emitDecoratorMetadata + 运行时库(如 reflect-metadata
  • 如果你用 Vite,默认不支持装饰器;需手动添加 @babel/plugin-proposal-decorators 并设 legacy: false

常见用途:日志、防抖、权限校验、自动绑定 this

装饰器适合封装横切逻辑,避免在每个方法里重复写样板代码。例如自动绑定 this

一帧秒创
一帧秒创

基于秒创AIGC引擎的AI内容生成平台,图文转视频,无需剪辑,一键成片,零门槛创作视频。

下载

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

function autobind(target, propertyKey, descriptor) {
  const originalMethod = descriptor.value;
  const adjDescriptor = {
    configurable: true,
    enumerable: false,
    get() {
      const boundFn = originalMethod.bind(this);
      Object.defineProperty(this, propertyKey, {
        value: boundFn,
        configurable: true,
        writable: true,
      });
      return boundFn;
    },
  };
  return adjDescriptor;
}

class Form {
  @autobind
  handleSubmit() {
    console.log(this); // 始终指向实例
  }
}

注意:这个写法依赖 get 懒绑定,不是所有场景都适用;若需立即绑定,得在构造函数中处理,装饰器无法介入构造过程。

装饰器不能解决所有问题,尤其涉及初始化顺序时

比如你想在类实例化后自动注册到某管理器,或依赖某个 ref 已就绪 —— 装饰器在定义阶段就执行,此时实例根本不存在。这类逻辑更适合放在 constructorconnectedCallback(Web Components)或 React 的 useEffect 中。

另一个典型陷阱:@Memoize 类装饰器若试图重写 constructor,会导致继承链断裂、super() 失效、instanceof 判断失败 —— 此时应优先考虑组合式工具函数,而非强行用装饰器“魔改”类结构。

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

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

6467

2023.07.31

网页undefined是什么意思
网页undefined是什么意思

网页undefined是指页面出现了未知错误的意思,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误。想了解更多的相关内容,可以阅读本专题下面的文章。

3335

2024.08.14

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

1664

2025.12.25

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

22

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

48

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

93

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

216

2026.03.05

热门下载

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

精品课程

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

共58课时 | 6万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1.1万人学习

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

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