AOP(面向切面编程)的主要作用是把一些跟核心业务逻辑模块无关的功能抽离出来,这些跟业务逻辑无关的功能通常包括日志统计、安全控制、异常处理等。把这些功能抽离出来之后,再通过“动态织入”的方式掺入业务逻辑模块中。这样做的好处首先是可以保持业务逻辑模块的纯净和高内聚性,其次是可以很方便地复用日志统计等功能模块。

    书中提到了以下方案:

    1. Function.prototype.before = function (beforefn) {
    2. var __self = this
    3. return function () {
    4. beforefn.apply(this, arguments)
    5. return __self.apply(this, arguments)
    6. }
    7. }
    8. var f = function () {
    9. console.log(2)
    10. }
    11. f = f.before(() => { console.log(1) })
    12. f()
    13. // 输出
    14. // 1
    15. // 2

    通过给函数添加一个before方法来使得每次执行目标函数的时候都会先执行一次before里的内容。

    然而在实际工作中,更多的场景是选择下面这种方案,不会污染原型链,也使得每一步操作比较清晰透明

    1. var fn = function () {
    2. // do something
    3. console.log(2)
    4. }
    5. var beforefn = function () {
    6. // do something
    7. console.log(1)
    8. }
    9. var f = function () {
    10. beforefn.apply(this, arguments)
    11. return fn.apply(this, arguments)
    12. }
    13. f()
    14. // 输出
    15. // 1
    16. // 2