当前位置:首页 > 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实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

js验证码的实现

js验证码的实现

验证码的基本实现原理 验证码(CAPTCHA)的核心目标是区分人类用户和自动化程序。JavaScript可用于生成或验证客户端验证码,但需注意纯前端验证可能被绕过,通常需结合后端验证。 纯前端验证码…

js实现菜单

js实现菜单

实现基本HTML结构 使用HTML创建菜单的基本框架,通常包含<ul>和<li>元素。示例结构如下: <ul id="menu"> <li><…

js实现上传图片

js实现上传图片

使用HTML5的File API实现图片上传 HTML5的File API允许通过JavaScript访问用户选择的文件。需要创建一个文件输入元素,并监听其change事件。 <input t…