你如何理解前端中的装饰器(Decorators)及其作用?

装饰器用于为函数或类添加额外功能,常见的应用场景包括日志记录、性能监测和权限验证。

设计模式 中等 JavaScript 装饰器 Decorator

装饰器是一种设计模式,用于在不改变原有对象的结构和调用方式的前提下,动态添加额外的功能,例如日志记录、性能监测、权限验证等。其主要作用是提高代码的模块化、复用性和可维护性,常用于切面编程(AOP)。常见的用法包括:

  1. 作用
    • 增强功能:为目标对象(如函数、类或方法)添加辅助逻辑(如日志、计时或校验)。
    • 解藕代码:将通用功能(如权限检查)从业务逻辑中分离,避免重复代码。
    • 重用性:通过装饰器组合复用在多个地方共享代码。
  2. 常见用法(应用场景)
    • 日志记录:记录函数执行的时间、参数或输出,用于调试。
    • 性能测试:测量函数的执行时间。
    • 权限校验:验证用户权限后再执行操作(如管理员仅限访问特定函数)。
    • 缓存机制:存储结果以避免重复计算。
    • 数据验证:检查输入参数的有效性(TypeScript 参数装饰器中常用)。
    • 路由映射:设置基于类的路由逻辑。
  3. 实现方式与示例(以 Python 为例)
    装饰器的基本结构是一个返回包装器(wrapper)的函数:
    def log_timestamp(func):  # 装饰器定义
      def wrapper(*args, **kwargs):  
        import datetime
        print(f"开始执行: {func.__name__}{datetime.datetime.now()}")
        result = func(*args, **kwargs)  
        return result  
      return wrapper  
    @log_timestamp  # 装饰器使用语法糖
    def greet():  
      print("Hello, world!")  
    greet()  # 调用方式与原函数一致,执行后会输出时间日志
    

    在这个例子中,@log_timestamp 增强了 greet 函数的功能。装饰器支持参数化设计:

    def rate_limited(delay):  # 带参数的装饰器  
      def decorator(func):  
        import time  
        def wrapper(*args, **kwargs):  
          time.sleep(delay)  
          return func(*args, **kwargs)  
        return wrapper  
      return decorator  
    @rate_limited(1)  # 延迟 1 秒执行  
    def fetch_data():  
      print("获取数据")  
    fetch_data()  # 应用延迟效果 
    
  4. 多语言适配
    在 TypeScript 中:作为类或方法装饰器,例如用于参数验证或路由绑定:
    @Route("/api")  // 类装饰器:应用路由映射
    class Controller {
      @Validator("input")  // 方法装饰器:验证方法参数
      create(@Arg() params: any) {}
    }  
    

    设计模式分类:装饰器符合“包装器”模式(Wrapped Design Pattern),属于结构模式范畴,增强了可扩展性而不修改原始目标。