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

 

posted @ 2017-05-08 11:26  _白马非马  阅读(635)  评论(0编辑  收藏  举报