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

浙公网安备 33010602011771号