当前位置:首页 > JavaScript

js aop实现

2026-03-01 09:17:18JavaScript

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

AOP是一种编程范式,允许在不修改原有代码的情况下,通过“切面”动态添加功能。以下是几种常见的实现方式:

使用高阶函数包装

通过函数包装在目标函数执行前后插入逻辑:

js aop实现

function wrap(targetFunc, beforeFunc, afterFunc) {
  return function() {
    beforeFunc && beforeFunc.apply(this, arguments);
    const result = targetFunc.apply(this, arguments);
    afterFunc && afterFunc.apply(this, arguments);
    return result;
  };
}

// 示例用法
const originalFunc = () => console.log('原始函数');
const loggedFunc = wrap(
  originalFunc,
  () => console.log('调用前'),
  () => console.log('调用后')
);

原型链扩展

通过修改Function原型实现AOP:

Function.prototype.before = function(beforeFn) {
  const self = this;
  return function() {
    beforeFn.apply(this, arguments);
    return self.apply(this, arguments);
  };
};

Function.prototype.after = function(afterFn) {
  const self = this;
  return function() {
    const result = self.apply(this, arguments);
    afterFn.apply(this, arguments);
    return result;
  };
};

// 示例用法
const func = () => console.log('主要功能');
const enhancedFunc = func
  .before(() => console.log('前置处理'))
  .after(() => console.log('后置处理'));

ES6 Proxy实现

利用Proxy对象拦截目标操作:

js aop实现

function createAopProxy(target, { before, after }) {
  return new Proxy(target, {
    apply(target, thisArg, args) {
      before && before.apply(thisArg, args);
      const result = Reflect.apply(target, thisArg, args);
      after && after.apply(thisArg, args);
      return result;
    }
  });
}

// 示例用法
const original = (x) => x * 2;
const proxy = createAopProxy(original, {
  before: () => console.log('计算开始'),
  after: () => console.log('计算结束')
});

装饰器实现(需要Babel转译)

使用ES7装饰器语法:

function log(target, name, descriptor) {
  const original = descriptor.value;
  descriptor.value = function(...args) {
    console.log(`调用 ${name} 参数: ${args}`);
    const result = original.apply(this, args);
    console.log(`调用 ${name} 结果: ${result}`);
    return result;
  };
  return descriptor;
}

class Example {
  @log
  add(a, b) {
    return a + b;
  }
}

面向对象的AOP实现

创建专门的AOP工具类:

class Aop {
  static before(target, method, advice) {
    const original = target[method];
    target[method] = function() {
      advice.apply(this, arguments);
      return original.apply(this, arguments);
    };
  }

  static after(target, method, advice) {
    const original = target[method];
    target[method] = function() {
      const result = original.apply(this, arguments);
      advice.apply(this, arguments);
      return result;
    };
  }
}

// 示例用法
const obj = { greet: name => `Hello ${name}` };
Aop.before(obj, 'greet', name => console.log(`即将问候 ${name}`));
Aop.after(obj, 'greet', () => console.log('问候完成'));

选择哪种实现方式取决于具体需求和技术栈。高阶函数和原型链方式兼容性最好,Proxy方式更现代但需要ES6支持,装饰器语法需要编译转换但最符合未来标准。

标签: jsaop
分享给朋友:

相关文章

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

js实现图

js实现图

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

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

链表实现js

链表实现js

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

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…