初识AOP(面向切面编程)

初识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

beforeafter都邑返回一个新的函数(一个函数外壳),将本来的函数储存到新的函数当中,同时把传入的函数也储存到新的函数。

var _self = this; // 保留原函数援用此处的this为何会是原函数的援用?

挪用时的语法:obj.method.before(...);before的前一个挪用栈是method,所以before内部的this采用了隐式绑定,this就是method

    原文作者:发条橙子
    原文地址: https://segmentfault.com/a/1190000008402458
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞