当前位置:首页 > JavaScript

js实现decorator

2026-04-05 19:37:58JavaScript

装饰器(Decorator)在 JavaScript 中的实现

装饰器是一种设计模式,用于在不修改原始函数或类的情况下扩展其功能。在 JavaScript 中,装饰器可以通过高阶函数或 ES7 的装饰器语法实现。

js实现decorator

使用高阶函数实现装饰器

高阶函数可以接收一个函数作为参数,并返回一个新的函数,从而实现对原函数的装饰。

js实现decorator

function logDecorator(func) {
  return function(...args) {
    console.log(`Calling function ${func.name} with arguments:`, args);
    const result = func.apply(this, args);
    console.log(`Function ${func.name} returned:`, result);
    return result;
  };
}

function add(a, b) {
  return a + b;
}

const decoratedAdd = logDecorator(add);
decoratedAdd(2, 3); // 输出日志并返回 5

使用 ES7 装饰器语法

ES7 引入了装饰器语法,可以直接通过 @ 符号对类或类成员进行装饰。需要在支持装饰器的环境(如 Babel 或 TypeScript)中运行。

类装饰器

function logClass(target) {
  console.log(`Class ${target.name} is decorated.`);
  return target;
}

@logClass
class MyClass {
  // 类定义
}

方法装饰器

function logMethod(target, name, descriptor) {
  const originalMethod = descriptor.value;
  descriptor.value = function(...args) {
    console.log(`Calling method ${name} with arguments:`, args);
    const result = originalMethod.apply(this, args);
    console.log(`Method ${name} returned:`, result);
    return result;
  };
  return descriptor;
}

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

const calc = new Calculator();
calc.add(2, 3); // 输出日志并返回 5

属性装饰器

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

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

const person = new Person();
person.name = 'Jane'; // 报错:Cannot assign to read only property

装饰器的应用场景

  • 日志记录:记录函数调用和返回值。
  • 性能监控:测量函数执行时间。
  • 权限控制:检查用户权限后再执行函数。
  • 数据验证:验证函数参数是否符合要求。

注意事项

  • 装饰器目前是 ECMAScript 的提案,尚未正式纳入标准。
  • 需要配合 Babel 或 TypeScript 使用,配置相应的插件(如 @babel/plugin-proposal-decorators)。
  • 装饰器不能用于函数(非类方法),除非使用高阶函数的方式。

标签: jsdecorator
分享给朋友:

相关文章

jquery.js

jquery.js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,用于简化 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它的设计宗旨是“Write Less, Do Mor…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:CSS…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…