JavaScript装饰器高级应用

千辰大大_4547

千辰大大_4547

2025-11-18

255人浏览

原创

装饰器通过声明式语法增强代码行为,适用于自动绑定、防抖、依赖注入等场景。1. 方法装饰器可解决this指向问题并实现防抖;2. 类装饰器用于标记服务和注入元数据;3. 参数装饰器辅助依赖注入类型识别;4. 属性装饰器支持响应式字段与运行时验证。这些模式在typescript及nestjs中广泛应用,提升代码可读性与复用性。

javascript装饰器高级应用

JavaScript 装饰器虽然目前还处于提案阶段(Stage 3),但在 TypeScript 和一些现代框架(如 Angular、NestJS)中已经广泛应用。装饰器提供了一种声明式的方式来增强类、方法、属性或参数的行为,尤其适合实现横切关注点,比如日志、权限控制、性能监控等。下面介绍几种高级应用场景和实用技巧。

1. 方法装饰器:实现自动绑定与防抖

在类中,函数作为回调使用时常常面临 this 指向丢失的问题。通过装饰器可以自动绑定上下文。

function bound(target, context) {
  return function (...args) {
    return target.call(this, ...args);
  };
}

class Button {
  @bound
  onClick() {
    console.log('按钮被点击', this.label);
  }
}

类似地,可以实现防抖装饰器:

function debounce(delay) {
  return function (target, context) {
    let timer;
    return function (...args) {
      clearTimeout(timer);
      timer = setTimeout(() => target.call(this, ...args), delay);
    };
  };
}

class SearchInput {
  @debounce(300)
  onInput(value) {
    console.log('搜索:', value);
  }
}

2. 类装饰器:注册服务与元数据注入

在依赖注入系统中,类装饰器常用于标记服务并附加元数据。

function Injectable(target) {
  Reflect.defineMetadata('injectable', true, target);
}

function Module({ providers }) {
  return function (target) {
    Reflect.defineMetadata('providers', providers, target);
  };
}

@Injectable
class ApiService { }

@Module({ providers: [ApiService] })
class AppModule { }

运行时可通过 Reflect.getMetadata 提取信息,配合 IoC 容器完成自动依赖解析。

Miller CSV TSV JSON 数据处理器
Miller CSV TSV JSON 数据处理器

Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。

下载

3. 参数装饰器:类型标注与依赖注入标识

参数装饰器可用于记录构造函数参数的依赖类型。

function Inject(token) {
  return function (target, context) {
    const existing = Reflect.getMetadata('design:paramtypes', target) || [];
    existing[context.ordinal] = token;
    Reflect.defineMetadata('design:paramtypes', existing, target);
  };
}

class Logger { log(msg) { } }

class UserService {
  constructor(@Inject(Logger) logger) {
    this.logger = logger;
  }
}

这种模式是 NestJS 等框架实现依赖注入的核心机制之一。

4. 属性装饰器:响应式数据与验证

在构建响应式系统时,可以用装饰器标记响应式字段。

function observable(target, context) {
  let value = target;
  Object.defineProperty(target, context.name, {
    get() { return value; },
    set(newValue) {
      console.log(`${context.name} 更新为:`, newValue);
      value = newValue;
    },
    enumerable: true,
    configurable: true
  });
}

class Store {
  @observable count = 0;
}

也可以结合验证库实现运行时校验:

function validate(pattern) {
  return function (target, context) {
    return {
      set(value) {
        if (!pattern.test(value)) {
          throw new Error(`无效值: ${value}`);
        }
        target[context.name] = value;
      },
      get() { return target[context.name]; }
    };
  };
}

class User {
  @validate(/^[a-zA-Z]+$/) name;
}

基本上就这些。装饰器的强大之处在于它把重复逻辑抽象成可复用的注解,让代码更清晰。虽然原生 JavaScript 支持还在推进中,但借助编译工具,现在就能享受这套优雅的编程范式。关键是理解其执行时机和返回值要求,避免副作用和闭包陷阱。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2026.02.13

232

17

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

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

2026.02.25

460

17

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

2026.03.13

311

19

TypeScript 全栈开发进阶指南
TypeScript 全栈开发进阶指南

面向有 JavaScript 基础的开发者,深入讲解 TypeScript 的类型系统与全栈开发实践。

2026.06.03

226

29

TypeScript Node.js 全栈工程化与Monorepo架构实践
TypeScript Node.js 全栈工程化与Monorepo架构实践

本专题围绕 TypeScript 在 Node.js 全栈开发中的工程化实践展开,系统讲解 Monorepo 架构设计、包管理策略、模块复用机制以及服务端与前端统一类型系统的构建方法。通过真实项目案例,帮助开发者提升大型全栈项目的可维护性与协作效率。

2026.06.16

438

8

go语言闭包相关教程大全
go语言闭包相关教程大全

本专题整合了go语言闭包相关数据,阅读专题下面的文章了解更多相关内容。

2025.07.29

3373

19

Aionclaw智能助手介绍
Aionclaw智能助手介绍

本专题汇总了AionClaw(AI龙虾助手)的功能介绍与在线使用入口。AionClaw是杭州趣猿人工智能有限公司推出的桌面级AI智能体,能直接在电脑上读写文件、运行脚本、操作浏览器,自动交付Word、PPT、Excel等成品。

2026.09.20

0

13

AionClaw AI智能体与电脑自动化任务执行功能使用教程
AionClaw AI智能体与电脑自动化任务执行功能使用教程

AionClaw专题整理AI智能体与电脑自动化相关功能使用教程,涵盖安装部署、AI任务执行、Skills技能、文件处理、浏览器控制、电脑操作、持久记忆、聊天工具连接以及办公、编程和内容创作等功能,帮助用户快速掌握AionClaw的实际使用方法。

2026.09.20

0

15

AI视频生成软件推荐
AI视频生成软件推荐

本专题汇总了当前主流的AI视频生成软件推荐与排行榜单,涵盖seko、AniShort、剧云、Lovart、LiblibAI及立刻mv等热门工具。同时整理了各软件在文生视频、图生视频、时长限制、画质表现及免费额度等方面的差异对比,助您快速选对适合创作需求的AI视频生成工具。

2026.09.16

180

9

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 11.9万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.5万人学习