装饰模式之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
时间: 2024-08-27 09:06:32

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

Delphi 动态改变Rzsplitter的Orientation(方向)属性

效果图: 原先不知道,弄了半天都改不了RzSplitter.Orientation = orHorizontal / orVertical 然后去查该组件的源代码,原来Orientation不是在RzSplit单元定义的,而是在RzCommon这个单元,uses它后,一切正常了. RzCommon Unit //... type TAlignmentVertical = ( avTop, avCenter, avBottom ); TBlinkState = ( bsOn, bsOff ); T

动态改变ComboBox下拉框的宽度

在C++Builder中有时下拉框的内容比较长,标准长度下根本显示不完,可以调用PostMessage()方法来实现 ::PostMessage(comb->Handle,CB_SETDROPPEDWIDTH,newwidth,0);//comb是一个ComboBox指针,newwidth是下拉框的新长度 这种方法在下面的情况下会失效1.动态改变了窗体的BorderStyle属性2.动态改变了窗体的Parent属性 摘自: http://showmealone.blog.sohu.com/760

Unreal Cook Book:动态改变材质的颜色等参数

项目常见需求之一就是在运行时,根据游戏逻辑或者其他奇葩需求动态改变对象的外观,其中一些需要动态改变材质的某些参数,例如颜色值,贴图等. 在虚幻4引擎中完成这个非常简便,主要分为三步: 创建包含材质参数的Material 如上图所示,我创建了一个非常简单的材质,其中包含"MColor"这样一个vector3的参数. 创建Dynamic Material Instance 接下来就要创建Dynamic Material Instance对象,一般可以在对象的Construction Scr

javascript生成表格增删改查 JavaScript动态改变表格单元格内容 动态生成表格 JS获取表格任意单元格 javascript如何动态删除表格某一行

jsp页面表格布局Html代码 <body > <center> <input type="text" value="111" id="mytext"> <table border="1" width="60%" id="mytable"> <tr> <td id="td1">第一行第一列<

EXTJS动态改变store的proxy的params

动态改变store的条件参数.var store = win.down('grid[name=sourceGrid]').getStore(); Ext.apply(store.proxy.extraParams, { id: model.id });

【ViewPager的学习】二、添加图片描述及指示点动态改变

第一节已经简单实现了ViewPager,但是实际应用中常常需要在图片资源底部添加一些图片描述信息,还有一些指示点. 效果如下: 指示点可以用shape生成一个简单的原点,代码如下: <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="

android 动态改变控件位置和大小 .

动态改变控件位置的方法: setPadding()的方法更改布局位置. 如我要把Imageview下移200px: ImageView.setPadding( ImageView.getPaddingLeft(),  ImageView.getPaddingTop()+200, ImageView.getPaddingRight(),  ImageView.getPaddingBottom()); 动态改变控件大小的方法: 1.声明控件参数获取对象 LayoutParams lp: 2.获取控件

Android通过String.format格式化(动态改变)字符串资源的显示内容

一.实现效果: 最近在项目中需要做类似于上图显示的效果,里面的数字和称谓是动态获取的,对于这种显示效果,有如下两种解决方案来处理: (1)通过代码动态设置TextView的内容,比如: /** * 显示今日状态 * * */ private void showTodayState( int totalUser, float upRate, String hornor, char level ){ StringBuilder todayStateStr = new StringBuilder( )

利用runtime实现延展动态改变模型类中属性的set,get方法

昨天大概的阐述了一下关于构架控制容器的概念,但是如果要丰满这个想法还有很多问题,比如如果我想对一些controller进行管理就势必涉及到controller的加载以及缓存,而想做这些的前提就是构建一个controller表.对表中设定的字符串管理,从而管理对应的controller.传统创建表的方法有很多,最为常用的就是plist文件,但是对于iOS开发的程序员来说,如果这个plist写死,在管理的时候就会比较死板,要知道oc是一门灵活的,动态的语言.如果我们使用NSUserDefaults,