当前位置:首页 > 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 支持。

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 库

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

标签: jsaop
分享给朋友:

相关文章

js实现继承

js实现继承

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

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

链表实现js

链表实现js

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

js实现代码雨

js实现代码雨

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

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…

js 实现滚动

js 实现滚动

实现滚动的方法 使用 window.scrollTo() window.scrollTo() 方法可以滚动到文档中的特定位置。可以指定 x 和 y 坐标,或者使用平滑滚动的选项。 // 滚动到指定位…