zoukankan      html  css  js  c++  java
  • 装饰模式之AOP之动态改变参数,和原函数绑定属性丢失

    //动态改变参数一
    Function.prototype.before = function( beforefn ){ var __self = this; return function(){ beforefn.apply( this, arguments ); // (1) return __self.apply( this, arguments ); // (2) } }
    var func = function( param ){
    console.log( param ); // 输出: {a: "a", b: "b"}
    }
    func = func.before( function( param ){
    param.b = 'b';
    });
    func( {a: 'a'} );

    //动态改变参数二

    var ajax= function( type, url, param ){
    console.log(param); // 发送 ajax 请求的代码略
    };
    然后把 Token 参数通过 Function.prototyte.before 装饰到 ajax 函数的参数 param 对象中:
    var getToken = function(){
    return 'Token';
    }
    ajax = ajax.before(function( type, url, param ){
    param.Token = getToken();
    });
    ajax( 'get', 'http:// xxx.com/userinfo', { name: 'sven' } );
    从 ajax 函数打印的 log 可以看到, Token 参数已经被附加到了 ajax 请求的参数中:
    {name: "sven", Token: "Token"}

     //注意事项

    值得注意的是,因为函数通过 Function.prototype.before 或者 Function.prototype.after 被装
    饰之后,返回的实际上是一个新的函数,如果在原函数上保存了一些属性,那么这些属性会丢失。
    代码如下:
    var func = function(){
    alert( 1 );
    }
    func.a = 'a';
    func = func.after( function(){
    alert( 2 );
    });
    alert ( func.a ); // 输出: undefined
  • 相关阅读:
    RPC框架实践之:Apache Thrift
    ubuntu中安装hadoop集群
    前端开发浏览器兼容问题
    3亿(int)数据-2亿(int)数据 求差集
    mvn docker 部署 每次都需要下载包的问题
    树莓派操作记录
    mysql 实现类似开窗函数的功能
    mysql 多字段更新
    go proxy转发工作中碰到的问题
    之前项目使用的轻量的goweb框架
  • 原文地址:https://www.cnblogs.com/WhiteHorseIsNotHorse/p/6824222.html
Copyright © 2011-2022 走看看