当前位置:首页 > 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实现轮播图

js实现轮播图

轮播图实现方法 基础HTML结构 <div class="slider"> <div class="slides"> <img src="image1.jpg…

js实现复制

js实现复制

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

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获取 jQ…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…

js实现原理

js实现原理

JavaScript 实现原理 JavaScript 是一种解释型语言,其实现原理涉及多个核心组件和运行机制,包括引擎、运行时环境、事件循环等。 引擎与解释执行 现代 JavaScript 引擎(如…