当前位置:首页 > JavaScript

js 实现装饰器

2026-03-15 17:28:41JavaScript

装饰器基础概念

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

js 实现装饰器

高阶函数实现装饰器

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

js 实现装饰器

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 使用,通过 @ 符号直接修饰类或方法:

@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中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js实现抽奖

js实现抽奖

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

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

节流js实现

节流js实现

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

js怎么实现异步

js怎么实现异步

异步实现方法 JavaScript中实现异步操作主要通过以下几种方式: Promise Promise是ES6引入的异步解决方案,用于处理异步操作的成功或失败状态。 const promise =…