zoukankan      html  css  js  c++  java
  • AOP函数

    Function.prototype.before = function( beforefn ){
    var __self = this; // 保存原函数的引用
    return function(){ // 返回包含了原函数和新函数的"代理"函数
    beforefn.apply( this, arguments ); // 执行新函数,且保证 this 不被劫持,新函数接受的参数
    // 也会被原封不动地传入原函数,新函数在原函数之前执行
    return __self.apply( this, arguments ); // 执行原函数并返回原函数的执行结果,
    // 并且保证 this 不被劫持
    }
    }
    Function.prototype.after = function( afterfn ){
    var __self = this;
    return function(){
    var ret = __self.apply( this, arguments );
    afterfn.apply( this, arguments );
    return ret;
    }
    };

    Function.prototype.before 接受一个函数当作参数,这个函数即为新添加的函数,它装载了
    新添加的功能代码。
    接下来把当前的 this 保存起来,这个 this 指向原函数,然后返回一个“代理”函数,这个
    “代理”函数只是结构上像代理而已,并不承担代理的职责(比如控制对象的访问等)。它的工作
    是把请求分别转发给新添加的函数和原函数,且负责保证它们的执行顺序,让新添加的函数在原
    函数之前执行(前置装饰),这样就实现了动态装饰的效果。
    我们注意到,通过 Function.prototype.apply 来动态传入正确的 this ,保证了函数在被装饰
    之后, this 不会被劫持。
    Function.prototype.after 的原理跟 Function.prototype.before 一模一样,唯一不同的地方在
    于让新添加的函数在原函数执行之后再执行。

    值得提到的是,上面的 AOP实现是在 Function.prototype 上添加 before 和 after 方法,但许
    多人不喜欢这种污染原型的方式,那么我们可以做一些变通,把原函数和新函数都作为参数传入
    before 或者 after 方法:

    var before = function( fn, beforefn ){
    return function(){
    beforefn.apply( this, arguments );
    return fn.apply( this, arguments );
    }
    }
    var a = before(
    function(){alert (3)},
    function(){alert (2)}
    );
    a = before( a, function(){alert (1);} );
    a();
  • 相关阅读:
    17.10.13
    17.10.12
    17.10.11
    17.10.10
    17.10.05
    17.10.04
    17.10.03
    17.10.02
    17.10.01
    17.9.29
  • 原文地址:https://www.cnblogs.com/TTblog5/p/13168174.html
Copyright © 2011-2022 走看看