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

Posted 白马非马

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰模式之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之动态改变参数,和原函数绑定属性丢失的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之装饰者模式

Javascript设计模式之装饰者模式详解篇

iOS设计模式之装饰者模式

面向切面编程AOP之动态代理

设计模式之动态代理模式

Spring AOP基础之JDK动态代理