JavaScript面向切面编程

2017-05-07  本文已影响0人  check_ping
定义

面向切面编程(AOP),主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。

应用场景

当一个函数内部的一段代码功能,在很多函数中都将被调用,我们的第一反应是将这块功能代码提取出来,再次封装调用,例如:

function test1(){
  console.log('这是大家都要执行的代码');
  console.log('这是test1要执行的代码');
}
function test2(){
  console.log('这是大家都要执行的代码');
  console.log('这是test2要执行的代码');
}

提取之后:

fucntion common(){
  console.log('这是大家都要执行的代码');
}
function test1(){
  common();
  console.log('这是test1要执行的代码');
}
function test2(){
  common()
  console.log('这是test2要执行的代码');
}

这种做法,相信大部分人在工作中都会这样做,但是为了保持一个函数的单一性(这里test1和test2的功能其实在加入了common这个函数的功能),所以我们要想办法将common函数的代码在test1函数调用之前来调用,那么我们可以这样做:

function test1(){
  console.log('这是test1要执行的代码');
}
function test2(){
  console.log('这是test2要执行的代码');
}
Function.prototype.before = function(fn){
  var _this = this;
  return function(){
    fn.apply(this,arguments);
    return _this.apply(this,arguments);
  }
}
test1.before(function(){
  console.log("这是大家都要执行的代码");
})();
test2.before(function(){
  console.log("这是大家都要执行的代码");
})();

通过这样的一个方法,就将函数的功能代码保持了单一性。

关于面向切面编程的理解,还是有所欠缺,希望理解透彻的老司机多来指点指点。

附上以前老司机对我提过的一个问题答案:
如何改写comsole.log方法,在控制台直接打印json字符串,就不用每次点开对象的属性去看了

var _old = console.log;
console.log = function(){
    var args = [].prototype.slice.call(arguments);
    for(let i = 0; i < args.length; i++){
        args[i] = JSON.stringify(args[i], null, 2);
    }
    _old.apply(this, args);
}
var val = {
    a: 1,
    b: 2
}
console.log(val);
控制台直接打印字符串
上一篇下一篇

猜你喜欢

热点阅读