【深圳】DJI 大疆创新 互联网团队 前端及大量职位招聘中 (内推 15-50k + 丰厚年终 + 股份)简历请发至 evan.zhou@dji.com, 合适的话当天回复,当天内推。 更多福利

AOP(Aspect Oriented Programming) 意为面向切面编程,利用AOP可以对业务逻辑各个部分进行隔离,从而使得业务逻辑各部分的耦合度降低,提高程序的可重用性。

主要功能

日志记录,性能统计,安全控制,事务处理,异常处理等等

主要意图

将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。

以上内容来自百度百科…

在JavaScript中的应用

JavaScript 中函数作为第一公民,有很多用法微妙的用法,实现AOP也很简单。我们可以把函数当成参数传递到另外一个函数中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Function.prototype.after = function (action) {
var func = this;
return function () {
var result = func.apply(this, arguments);
action.apply(this,arguments);
return result;
};
};

Function.prototype.before = function (action) {
var func = this;
return function () {
action.apply(this,arguments);
return func.apply(this, arguments);
};
};

拿 before 来解释下,首先保留一个 this (原函数)的引用,然后返回一个包含原函数和新函数的‘新函数’,在这个’新函数’里面,我们按照需求把两个函数执行一遍,并返回原函数执行的结果,保证 this 不被劫持。

由于我们是在Function.prototype上进行扩展,所以所有的Function都可以使用这样的方法。

1
2
3
4
5
6
7
8
9
10
11
var foo = function() {
console.log(2);
}

foo = foo.before(function() {
console.log(1);
}).after(function() {
console.log(3);
});

foo();

执行结果就是1,2 ,3

这种做法很妙,我们可以把与核心业务逻辑模块无关的功能抽离出来,然后在不修改源代码的情况下给程序动态地添加功能。

1
2
3
4
5
var foo = function(){
// 成千上万行代码
bar();
// 成千上万行代码
};

=>

1
2
3
4
5
var foo = (function(){
// 成两千上万行代码
}).after(function() {
bar();
});

改写过后会让我们的业务逻辑模块更加纯净。

推荐阅读

如需转载,请注明出处: http://w3ctrain.com / 2016/02/22/aop-in-javascript/

AOP