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