1. 高阶函数实现AOP
AOP(面向切面编程)的主要作用是把一些跟核心业务逻辑无关的功能抽离出来。 这些跟业务逻辑无关的功能通常包括日志统计、安全控制、异常处理等。 把这些功能抽离出来之后, 再通过"动态植入"的方式掺入业务逻辑模块中。 这样做的好处首先可以保持业务逻辑模块的纯净和高内聚性, 其次是可以很方便的复用日志统计等功能模块。
通常在js中实现AOP, 都是把一个函数"动态植入"到另外一个函数之中, 具体的实现技术有很多。 下面我们通过扩展Function.prototype来做到这一点, 代码如下
Function.prototype.before = function(beforefn) {
let _self = this; // 保存原函数的引用
// 返回包含了原函数和新函数的"代理"函数
return function() {
beforefn.apply(this, arguments);
// 执行新函数, 修正this
return _self.apply(this, arguments);
// 执行原函数
}
}
Function.prototype.after = function(afterfn) {
let _self = this;
return function() {
let ret = _self.apply(this, arguments);
afterfn.apply(this, arguments);
return ret;
}
}
// 使用
export function mergeFunc(str = 2) {
let mid = function() {
console.log(str)
};
mid = mid
.before(function () {
console.log(1)
})
.after(function () {
console.log(3)
})
.after(function(){
console.log(4)
})
return mid();
}
// 结果 => 1, 2, 3, 4
这种使用AOP的方式来给函数添加职责,也是js语言中一种非常特别和巧妙的装饰者模式实现。 这种装饰者模式在实际开发中非常有用。