JavaScript AOP 使用

出处:<a href="https://www.cnblogs.com/zengyuanjun/p/7429968.html">https://www.cnblogs.com/zengyuanjun/p/7429968.html</a>

/**
 * @desc 面向aop编程
 * @param {Function} originFunc - 源方法
 * @param {Function} before - 在源代码执行之前的方法体
 * @param {Function} after - 在源代码执行之后的方法体
 */
function constructor(originFunc, before, after) {
  return function() {
    before.apply(this, arguments);
    originFunc.apply(this, arguments);
    after.apply(this, arguments);
  }
}


function calcAdd(a, b) {
  console.log(a+b);
  return a + b;
}

// AOP增强
calcAdd = constructor(calcAdd, function() {
  console.log('add before');
}, function() {
  console.log('add after');
});

// 要求依次执行 add before 5 add after
calcAdd(2, 3);



// AOP 工厂模式

var aopFactory = function(before, after) {

  // 构造方法,在原方法前后增加执行方法
  function constructor(originFun){
    function _class(){
      proxy.before.apply(this, arguments);
      originFun.apply(this, arguments);
      proxy.after.apply(this, arguments);
    }
    return _class;
  }

  // 代理对象,a为被代理方法,b为目标对象
  var proxy = {
    add: function(a, b) {
      var fnName = '';
      if (typeof a === 'function') {
        fnName = a.name;
      } else if (typeof a === 'string') {
        fnName = a;
      } else {
        return;
      }
      // 不传对象的话默认为window
      b = b || window;
      if (typeof b === 'object' && b[fnName]) {
        b[fnName] = constructor(b[fnName]);
      }
    },
    before: function() {

    },
    after: function() {

    }
  };

  if (typeof before === 'function') {
    proxy['before'] = before;
  }
  if (typeof after === 'function') {
    proxy['after'] = after;
  }

  return proxy;
}




var printProxy, checkProxy;
    
// 打印参数
function printArguments(){
  for(var i = 0; i < arguments.length; i++){
    console.info("param" + (i + 1) + " = " + arguments[i]);
  }
}

// 打印和
function printSum() {
  var sum = 0;
  for(var i = 0; i < arguments.length; i++){
    sum += arguments[i];
  }  
  console.log('和', sum);
}

// 传入一个打印参数的AOP前增强
printProxy = aopFactory(printArguments, printSum);

function calcAdd(a, b) {
  return a + b;
}

// 传入需要增强的原方法
printProxy.add(calcAdd);
calcAdd(1, 2);

原文 

https://www.maiyewang.com/archives/86169

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » JavaScript AOP 使用

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址