JavaScript中aop的初步实现

熟悉java的同学们都知道spring的特点之一就是aop(面向切面编程),什么叫面向切面编程呢,官方解释是:

它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,

并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,

便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

在传统的编程中,我们写好了一个业务的逻辑代码,突然中间增加了一个需求,完了,又得重新再写一遍,

就没有类似于spring的aop的方式吗?经过研究后得出,有的。

*目前只适用于同步方法

Function.prototype.after = function(func, parm1, parm2) {
  var param1 = null,
  param2 = null;
  if(typeof func !== "function") {
    return false;
  }
  if(parm1) {
    parm1 = dealParam(parm1);
  }
  if(parm2) {
    parm2 = dealParam(parm2);
  }

  var _self = this;
  return function() {
    var _this = this;
    _self.apply(_this, parm1);
    func.apply(_this, parm2);
  }
}

首先我们对Function对象进行扩展,给Function增加一个方法after,这样我们就可以直接以func1.after(func2)的形式来调用此方法,

我们可以看到after方法总共有三个参数,第一个参数是一个function,后面两个分别是调用者和被调用函数的参数,

然后在after内部对参数进行容错处理,最后的返回值才是这段代码的关键,调用之后返回一个function,返回的function内部对传入的函数进行了先后顺序排列,从而达到改变函数执行顺序的目的。

当然了这里只是对同步方法来说的,有人就会问,那异步的呢,下来我就说一下异步的解决方案:

1. Promise 

Promise是es6新增的异步处理对象,使用前请确保你的项目要求支持promise,以前异步处理是一个很头疼的问题,但promise完美的解决了这个问题。

对Promise不了解的同学请自行去了解。

2 $.deferred


类似于Promise的jquery异步处理对象,比较稳定,是jquery中对异步事件的处理比较成熟,能满足大部分情况下的需求。对deferred不了解的同学请自行去了解。

有了上面两个对象异步方法实现切面编程就是有可能的。

最后附上我的github源码链接:

https://github.com/wangKXX/jsAop

 

posted @ 2017-12-15 14:47  灵魂创造者  阅读(204)  评论(0)    收藏  举报