当前位置:首页 > JavaScript

js 实现aop

2026-03-02 07:44:26JavaScript

在 JavaScript 中实现 AOP(面向切面编程)

AOP 是一种编程范式,允许开发者将横切关注点(如日志、性能监控、事务管理等)从业务逻辑中分离出来。以下是几种在 JavaScript 中实现 AOP 的方法:

使用高阶函数

通过高阶函数包裹目标函数,可以在调用前后注入逻辑。

function wrap(targetFn, beforeFn, afterFn) {
  return function(...args) {
    if (beforeFn) beforeFn.apply(this, args);
    const result = targetFn.apply(this, args);
    if (afterFn) afterFn.apply(this, args);
    return result;
  };
}

const originalFn = () => console.log('业务逻辑');
const wrappedFn = wrap(originalFn, 
  () => console.log('调用前逻辑'),
  () => console.log('调用后逻辑')
);
wrappedFn();

使用 ES6 Proxy

Proxy 可以拦截对象操作,非常适合实现 AOP。

const createAopProxy = (target, { before, after }) => {
  return new Proxy(target, {
    apply: (target, thisArg, args) => {
      if (before) before.apply(thisArg, args);
      const result = target.apply(thisArg, args);
      if (after) after.apply(thisArg, args);
      return result;
    }
  });
};

const fn = () => console.log('业务逻辑');
const proxiedFn = createAopProxy(fn, {
  before: () => console.log('前置通知'),
  after: () => console.log('后置通知')
});
proxiedFn();

使用装饰器(Decorator)

在支持 ES7 装饰器的环境中,可以用装饰器语法实现 AOP。

function log(target, name, descriptor) {
  const original = descriptor.value;
  descriptor.value = function(...args) {
    console.log(`调用 ${name} 方法`);
    return original.apply(this, args);
  };
  return descriptor;
}

class Service {
  @log
  doSomething() {
    console.log('执行业务逻辑');
  }
}

new Service().doSomething();

使用 AOP 库

现有库如 aspect.js 提供了更完整的 AOP 支持。

import { before, after } from 'aspect.js';

class Service {
  @before(() => console.log('方法调用前'))
  @after(() => console.log('方法调用后'))
  doSomething() {
    console.log('执行业务逻辑');
  }
}

new Service().doSomething();

选择建议

  • 简单场景使用高阶函数或 Proxy
  • TypeScript/ES7 项目推荐使用装饰器
  • 复杂需求考虑专用 AOP 库

每种方法都能有效分离关注点,选择取决于项目环境和技术栈。

js 实现aop

标签: jsaop
分享给朋友:

相关文章

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以…

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js实现全屏

js实现全屏

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

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(func…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…