首页 > 代码库 > 装饰模式之AOP之动态改变参数,和原函数绑定属性丢失

装饰模式之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

 

装饰模式之AOP之动态改变参数,和原函数绑定属性丢失