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);
控制台直接打印字符串