• JavaScript面向切面编程入门


    来源极客网学习视频

    关键词Javascript AOP编程

    例子1:

    function test() {
        alert(2);
    }
    //理解,所谓的传入一个"回调",该怎样设计before函数
    test.before(function(){
        alert(1);
    });
    //思路1:声明一个大Function然后在它的"原型链"上绑上一个before方法,代码如下
    Function.prototype.before = function(fn){ var __self = this; //怎样拿到当前函数 fn(); __self.apply(this,arguments); };

    例子2: 为我们自定义的JavaScript的Function设计一"行为",如下例子,声明我们的一个test方法

    function test() {
        alert(2);
        return "me test";
    }

    要求实现如下效果,为test"赋予"一能力, 在test执行前,先执行我们的另外设计的一个function,比如叫  function before() ,并达到如下效果

    test.before(function(){
        alert(1); 
    })(); 

    例子3:

    function test() {
        alert(2);
    }
    //思路1:声明一个大Function然后在它的"原型链"上绑上一个before方法,代码如下
    //思路2:实现在test()被调用的时候,我们定义的function被回调?  所以为function增加回调函数参数,第7行的fn
    //思路3:怎样让before执行在test之前?
    Function.prototype.before = function(fn){
        var __self = this;        //怎样拿到当前函数
        fn();
        return __self.apply(this,arguments);
    };
    
    Function.prototype.after = function(fn){
        //after先执行本身this, 再执行"回调"
        var __self = this;
        __self.apply(this, arguments);
        fn();
    };
    //阅读代码, 调用test的before()方法,并输入一个回调函数
    test.before(function(){
        alert(1); //输入的回调函数是被"谁"调的,答,由before函数实现代码决定的
    })
    //理解: 1.所谓的传入一个"回调"; 2.下面的代码可以理解成,我们需要设计function test的after行为
    test.after(function(){
        alert(3);
    });
    //注意点: 从第20行起开始执行, 默认函数test()被执行了2遍

    例子4: 执行test前,先执行before(), 实际运行的效果先后打印1,2

    1 Function.prototype.before = function(fn){
    2     var __self = this;
    3     return function(){
    4         fn.apply(__self,arguments);
    5         __self.apply(__self,arguments);
    6     }
    7 };

    解读:第4行表示先执行回调函数, 同时将调用者自身传入进去; 第5行表示执行调用者自身,同时将自己以及参数传入进去

    在实际coding过程中发现将第4,第5行写成如下形式,执行效果一样,先后打印1,2

    fn.apply();
    __self.apply();

     进一步理解,再看下面的代码,其中 test() 方法同上

     1 Function.prototype.before = function(fn){
     2     var __self = this;
     3     return function(){
     4         fn.apply(this,arguments);//理解JavaScript中所谓的"动态改变指针"的特性
     5         __self.apply(__self,arguments);//__self.apply(this,arguments);
     6     }
     7 };
     8 
     9 Function.prototype.after = function(fn){
    10     //after先执行本身this, 再执行"回调"
    11     var __self = this;
    12     return function(){
    13         __self.apply(__self, arguments);
    14         fn.apply(this,arguments);
    15     }    
    16 };
    17 //当完成上面的设计后,我们就可以将after"移"到before之后,代码如下
    18 test.before(function(){
    19     alert(1); 
    20 }).after(function(){
    21     alert(3); 
    22 })(); 

    将第5行__self改成this也是可以的,表示将调用者的"指针"传入进去
    将第13行注释掉,则只打印3,
    说明: test.before(function(){alert(1); })  被整个传入了 after() 方法中去了并且被执行了

  • 相关阅读:
    C# 杂项
    C# 数组
    我的博客第一天
    Java使用多线程异步执行批量更新操作
    Python爬取百度图片
    以友盟+U-Push为例,深度解读消息推送的筛选架构解决方案应用与实践
    python自动化办公之爬取HTML图片写入PPT实战
    理解Python闭包,这应该是最好的例子
    爬取b站《守护解放西》弹幕
    爬取b站《守护解放西》弹幕
  • 原文地址:https://www.cnblogs.com/zhuji/p/6557127.html
Copyright © 2020-2023  润新知