高阶javascript用法

54 阅读1分钟

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语言中一种非常特别和巧妙的装饰者模式实现。 这种装饰者模式在实际开发中非常有用。