es6类虽不原生支持aop,但可通过高阶函数轻量实现切面逻辑:不侵入类定义,仅动态增强实例方法,支持before/after/around模式,需注意this绑定、异步处理及避免过度嵌套。

ES6 类本身不直接支持 AOP,但结合高阶函数可以自然、轻量地实现切面逻辑,关键在于“不侵入类定义,只增强方法调用”。不需要 Proxy 或装饰器语法(除非项目已启用),纯函数式方式就能覆盖大多数场景。
给类方法动态织入 before/after 逻辑
核心思路:不修改类内部代码,而是在实例化后或调用前,用高阶函数包装特定方法。
- 先提取目标方法(如 user.save),再用 before 或 after 函数包裹它
- 注意绑定 this,避免丢失上下文——推荐用 fn.bind(instance) 或箭头函数闭包保底
- 示例:对 User 类的 login 方法加登录埋点
return function(...args) {
console.log('track: login start');
const res = fn.apply(this, args);
console.log('track: login success');
return res;
};
}
class User {
login() { return 'ok'; }
}
const u = new User();
u.login = withTrack(u.login); // 动态增强
u.login(); // 输出埋点日志
around 模式:完全控制执行流程
适合需要拦截、改参、跳过执行、或统一兜底的场景(比如权限校验失败直接返回)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- around 接收原函数 + 前置逻辑 + 后置逻辑,返回一个新函数
- 可选择是否真正调用原函数,也可包裹 Promise 处理异步
- 不建议直接改写类原型,优先作用于实例方法,避免污染全局
return function(...args) {
before.call(this, ...args);
try {
const result = original.apply(this, args);
after.call(this, result, ...args);
return result;
} catch (e) {
after.call(this, null, ...args);
throw e;
}
};
}
// 使用
u.fetchData = around(u.fetchData, () => console.log('loading...'), (res) => console.log('done:', res));
封装成可复用的增强工具函数
把切面逻辑抽成独立函数库,团队协作时更可控、易测试。
- 导出 beforeEach、onceAfter、throttleAround 等语义化函数
- 支持传入配置对象(如 onlyInDev、skipIf、timeoutMs),避免硬编码判断
- 配合 TypeScript 写好类型:输入是 (this: T, ...args: any[]) => any,输出同签名,保障类型安全
注意事项:别让切面变成黑盒
高阶函数实现 AOP 很灵活,但也容易失控。
- 避免多层嵌套包装(比如连续 5 次 around),调用栈会变深,debug 困难
- 异步方法需显式处理 Promise 或 async/await,否则后置逻辑可能提前执行
- 不要在构造函数里自动增强所有方法——按需增强,明确声明依赖关系
- 测试时,可直接 import 切面函数,单独测它的行为,再与业务函数组合验证
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










