当前位置:首页 > JavaScript

js怎么实现装饰器

2026-04-04 16:40:06JavaScript

装饰器基础概念

装饰器是一种特殊类型的声明,能够被附加到类声明、方法、访问器、属性或参数上。装饰器使用@expression形式,expression求值后必须是一个函数,该函数会在运行时被调用,装饰器的声明信息作为参数传入。

实现方法装饰器

方法装饰器应用于方法的属性描述符,可以观察、修改或替换方法定义。方法装饰器接收三个参数:目标对象、属性名、属性描述符。

function log(target, name, descriptor) {
  const originalMethod = descriptor.value;
  descriptor.value = function(...args) {
    console.log(`Calling ${name} with`, args);
    return originalMethod.apply(this, args);
  };
  return descriptor;
}

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

实现类装饰器

类装饰器应用于类构造函数,可以用来观察、修改或替换类定义。类装饰器接收一个参数:类的构造函数。

js怎么实现装饰器

function seal(constructor) {
  Object.seal(constructor);
  Object.seal(constructor.prototype);
}

@seal
class MyClass {
  method() {}
}

实现属性装饰器

属性装饰器应用于类的属性,接收两个参数:目标对象、属性名。属性装饰器不能直接修改属性的值,但可以通过返回属性描述符来影响属性的行为。

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

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

实现参数装饰器

参数装饰器应用于构造函数或方法参数,接收三个参数:目标对象、方法名、参数索引。参数装饰器通常用于标记参数的特殊用途。

js怎么实现装饰器

function validate(target, propertyKey, parameterIndex) {
  // 添加元数据标记参数需要验证
}

class ApiService {
  fetchData(@validate id) {
    // 获取数据逻辑
  }
}

装饰器工厂

装饰器工厂是一个返回装饰器函数的函数,允许通过参数配置装饰器行为。

function log(message) {
  return function(target, propertyKey, descriptor) {
    const originalMethod = descriptor.value;
    descriptor.value = function(...args) {
      console.log(message);
      return originalMethod.apply(this, args);
    };
    return descriptor;
  };
}

class Service {
  @log('Executing process')
  process() {
    // 处理逻辑
  }
}

注意事项

  1. 装饰器目前是ECMAScript提案,尚未成为正式标准
  2. TypeScript和Babel等工具提供了装饰器支持
  3. 装饰器执行顺序:参数装饰器 > 方法/访问器/属性装饰器 > 类装饰器
  4. 同一目标的多个装饰器按声明顺序从下到上执行

配置环境支持

在TypeScript中启用装饰器需要在tsconfig.json中设置:

{
  "compilerOptions": {
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true
  }
}

在Babel中需要安装@babel/plugin-proposal-decorators插件并在配置中启用:

{
  "plugins": [
    ["@babel/plugin-proposal-decorators", { "legacy": true }]
  ]
}

标签: js
分享给朋友:

相关文章

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Pro…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…

js实现滑动

js实现滑动

实现滑动效果的方法 在JavaScript中实现滑动效果可以通过多种方式完成,以下是几种常见的实现方法: 使用CSS过渡和JavaScript触发 通过CSS定义过渡效果,JavaScript控制触…