当前位置:首页 > JavaScript

js 实现装饰器

2026-03-15 17:28:41JavaScript

装饰器基础概念

装饰器是一种设计模式,用于在不修改原函数代码的情况下增强其功能。在 JavaScript 中,装饰器通过高阶函数或 ES7 的装饰器语法实现,常用于类、方法或属性。

高阶函数实现装饰器

通过高阶函数(函数返回函数)包裹目标函数,添加额外逻辑:

function logDecorator(fn) {
  return function(...args) {
    console.log(`调用函数: ${fn.name}, 参数: ${args}`);
    return fn.apply(this, args);
  };
}

function greet(name) {
  return `Hello, ${name}!`;
}

const decoratedGreet = logDecorator(greet);
console.log(decoratedGreet("Alice")); // 输出日志并返回结果

ES7 装饰器语法

需配合 Babel 或 TypeScript 使用,通过 @ 符号直接修饰类或方法:

js 实现装饰器

@logClass
class Example {
  @readonly
  value = 42;

  @debounce(300)
  handleClick() {
    console.log("Clicked!");
  }
}

function logClass(target) {
  console.log(`装饰类: ${target.name}`);
}

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

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

装饰器应用场景

  • 日志记录:自动记录函数调用信息。
  • 权限校验:在方法执行前检查用户权限。
  • 性能优化:实现防抖(debounce)或节流(throttle)。
  • 属性保护:通过 @readonly 禁止修改属性。

注意事项

  • ES7 装饰器需编译工具支持(如 Babel 的 @babel/plugin-proposal-decorators)。
  • 装饰器不能用于函数(仅类、方法、属性)。
  • 第三方库(如 core-decorators)提供常用装饰器工具。

通过灵活运用装饰器,可以显著提升代码的可维护性和复用性。

标签: js
分享给朋友:

相关文章

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

js实现继承

js实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm安…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…