当前位置:首页 > JavaScript

js怎么实现装饰器

2026-03-01 15:51:45JavaScript

在JavaScript中实现装饰器(Decorator)主要依赖于ES7的装饰器提案,目前需要通过Babel等工具转译使用。以下是几种常见的实现方式和应用场景:

类装饰器

类装饰器接收目标类作为参数,可以修改或扩展类的行为。例如添加静态属性或拦截构造函数:

function logClass(target) {
  target.prototype.log = function() {
    console.log('Logged:', this);
  };
  return target;
}

@logClass
class MyClass {}
const instance = new MyClass();
instance.log(); // 输出: Logged: MyClass {}

方法装饰器

方法装饰器接收三个参数:目标对象、属性名和属性描述符。常用于日志记录或性能监控:

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

class Person {
  @readonly
  name() { return 'John' }
}
const person = new Person();
person.name = 'Alice'; // TypeError: Cannot assign to read only property

属性装饰器

属性装饰器接收目标对象和属性名,常用于元编程或属性初始化:

function format(formatString) {
  return function(target, key) {
    let value = target[key];
    const getter = () => value;
    const setter = (newVal) => {
      value = formatString + newVal;
    };
    Object.defineProperty(target, key, {
      get: getter,
      set: setter
    });
  }
}

class User {
  @format('Hello ')
  greeting = 'World';
}
const user = new User();
console.log(user.greeting); // 输出: Hello World

参数装饰器

参数装饰器用于标记或修改方法参数,常见于依赖注入场景:

function validate(target, key, index) {
  const validator = target[key].__validators || (target[key].__validators = []);
  validator.push({
    index,
    validate: (value) => value !== undefined
  });
}

class ApiService {
  fetchData(@validate id) {
    // 方法实现
  }
}

装饰器工厂

通过高阶函数创建可配置的装饰器,增强灵活性:

js怎么实现装饰器

function delay(ms) {
  return function(target, key, descriptor) {
    const originalMethod = descriptor.value;
    descriptor.value = function(...args) {
      setTimeout(() => {
        originalMethod.apply(this, args);
      }, ms);
    };
    return descriptor;
  };
}

class Logger {
  @delay(1000)
  log(msg) {
    console.log(msg);
  }
}
new Logger().log('Delayed'); // 1秒后输出

注意事项

  • 需要安装@babel/plugin-proposal-decorators插件并配置legacy: true
  • 装饰器在TypeScript中需要启用experimentalDecorators选项
  • 装饰器执行顺序:参数装饰器 → 方法/属性装饰器 → 类装饰器(从下到上)

以上实现方式展示了装饰器在JavaScript中的核心应用模式,可根据实际需求组合使用这些技术方案。

标签: js
分享给朋友:

相关文章

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与响应式…

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 // 获取所有…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…