当前位置:首页 > JavaScript

js怎么实现装饰器

2026-03-01 15:51:45JavaScript

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

类装饰器

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

js怎么实现装饰器

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

属性装饰器

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

js怎么实现装饰器

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) {
    // 方法实现
  }
}

装饰器工厂

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

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
分享给朋友:

相关文章

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

js实现代码雨

js实现代码雨

实现代码雨效果 使用HTML5 Canvas和JavaScript可以轻松实现经典的代码雨效果。以下是完整的实现代码和说明: HTML结构 <!DOCTYPE html> <h…

js实现路由

js实现路由

js实现路由的方法 在JavaScript中实现路由功能可以通过多种方式完成,以下是几种常见的方法: 使用原生JavaScript实现路由 通过监听window.onhashchange事件来实现基…