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();
  • 相关阅读:
    程序员版狂人日记二 .
    [骑行小记1]骑在上海
    启动/关闭xp_cmdshell
    脑力风暴之小毛驴历险记(3)低进高出的小鸡(上)
    如何查看SQL Server的实例名(转载)
    MSBuild 项目属性以及任务参考
    SQL update 语句中使用表别名&&查找占用数据库的进程
    [当算法遇上数学]元芳,你怎么能随即生成m个数,让其和等于n?(加强版)
    IIS error: Service Unavailable : HTTP Error 503. The service is unavailable
    SQL with(nolock)详解 [转]
  • 原文地址:https://www.cnblogs.com/TTblog5/p/13168174.html
Copyright © 2011-2022 走看看