初识AOP(面向切面编程)
AOP的定义
AOP是什么?现在本身的明白是把一个函数‘动态的的插进去’到别的一个函数当中,就像一个钩子一样。下面是细致的定义。
面向切面编程(AOP是Aspect Oriented Program的首字母缩写) ,我们晓得,面向对象的特点是继续、多态和封装。而封装就请求将功用疏散到差别的对象中去,这在软件设想中每每称为职责分派。实际上也就是说,让差别的类设想差别的要领。如许代码就疏散到一个个的类中去了。如许做的优点是降低了代码的庞杂水平,使类可重用。
然则人们也发明,在疏散代码的同时,也增加了代码的反复性。什么意思呢?比如说,我们在两个类中,能够都须要在每一个要领中做日记。按面向对象的设想要领,我们就必须在两个类的要领中都到场日记的内容。或许他们是完全相同的,但就是由于面向对象的设想让类与类之间没法联络,而不能将这些反复的代码一致起来。
或许有人会说,那好办啊,我们能够将这段代码写在一个自力的类自力的要领里,然后再在这两个类中挪用。然则,如许一来,这两个类跟我们上面提到的自力的类就有耦合了,它的转变会影响这两个类。那末,有无什么方法,能让我们在须要的时刻,随便地到场代码呢?这类在运行时,动态地将代码切入到类的指定要领、指定位置上的编程头脑就是面向切面的编程。
一般而言,我们管切入到指定类指定要领的代码片断称为切面,而切入到哪些类、哪些要领则叫切入点。有了AOP,我们就能够把几个类共有的代码,抽取到一个切片中,比及须要时再切入对象中去,从而转变其原有的行动。
如许看来,AOP实在只是OOP的补充罢了。OOP从横向上区分出一个个的类来,而AOP则从纵向上向对象中到场特定的代码。有了AOP,OOP变得平面了。假如加上时候维度,AOP使OOP由本来的二维变成三维了,由平面变成平面了。从技术上来讲,AOP基本上是经由过程代办机制完成的。
AOP在编程历史上能够说是里程碑式的,对OOP编程是一种非常有益的补充。
脍炙人口的代码
Function.prototype.before = function(beforeFn) {
var _self = this; // 保留原函数援用
return function(){ // 返回包含了原函数和新函数的‘代办’函数
beforeFn.apply(this, arguments); // 实行新函数,修改this
return _self.apply(this, arguments); // 实行原函数
}
};
Function.prototype.after = function(afterFn) {
var _self = this;
return function(){
var ret = _self.apply(this, arguments);
afterFn.apply(this, arguments);
return ret;
}
}
var obj = {
name: 'tangdy',
before: 'this is before',
after: 'this is after',
method: function(){
console.log(this.name);
}
}
obj.method = obj.method.before(function(){
console.log(this.before)
}).after(function(){
console.log(this.after)
});
obj.method();
// this is before
// tangdy
// this is after
before
和after
都邑返回一个新的函数(一个函数外壳),将本来的函数储存到新的函数当中,同时把传入的函数也储存到新的函数。
var _self = this; // 保留原函数援用
此处的this为何会是原函数的援用?
挪用时的语法:obj.method.before(...)
;before
的前一个挪用栈是method
,所以before
内部的this
采用了隐式绑定,this
就是method
。