AOP切面操作之before,after,around

开发项目中,有时候需要在引入的包之前处理一些事情,比如日志记录,性能统计,安全控制,事务处理,异常处理、重设状态量。为了代码的优雅和规范,这时候会引入AOP的一系列增强操作。

将增强操作的代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。

常用的AOP操作包括:

  • Before前置增强是在所拦截方法执行之前执行一段逻辑。
  • After后置增强是在所拦截方法执行之后执行一段逻辑。
  • Around环绕增强是可以同时在所拦截方法的前后执行一段逻辑。
    这里直接给出相关代码:
function before (obj, method, fn) {
  const old = obj[method]
  obj[method] = function () {
    fn.call(this)
    old.apply(this, arguments)
  }
}
function after (obj, method, fn) {
  const old = obj[method]
  obj[method] = function () {
    old.apply(this, arguments)
    fn.call(this)
  }
}
function around (obj, method, fn) {
  const old = obj[method]
  obj[method] = function () {
    return fn.call(this, old, [...arguments])
  }
}

其实代码很简单,只不过需要特别注意的是js中this的指向,

  • 全局作用域或者普通函数中this指向全局对象window或Global
  • 方法调用中谁调用this指向谁
  • 在构造函数或者构造函数原型对象中this指向构造函数的实例