`
kalogen
  • 浏览: 878210 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

简析 createDelegate

    博客分类:
  • EXT
阅读更多

关于回调函数指定参数问题,由来已久,extjs简洁优雅完美的解决了这个问题,今天来学习一下(不推荐 createCallback

 

 

createDelegate ( [Object obj ] , [Array args ] , [Boolean/Number appendArgs ]  ) : Function



返回一个函数, 这个函数调用原函数,原函数中的this指向obj ,关于这个函数的参数由 appendArgs 指定 :

如 function2=function1.createDelegate(obj,args,appendArgs);

function2 call function1 ,function1 中的 this == obj

1. appendArgs falsy

那么 调用 function2时传的参数被忽略,args数组参数作为function1的参数运行。

2. appendArgs === true

那么 调用 function2时传的参数放在args数组前面合成一个新的数组,作为function1的参数运行。

3.typeof appendArgs == 'Number'

假设 调用 function2时传的参数 为 array1 (注意要 slice 为 真正的 Array)
那么将 args 数组插入到 array1 的指定 appendArgs位置 (利用 splice( appendArgs,0 ))
然后再把最终数组 作为function1的参数运行。



示例使用代码:

Html代码 复制代码
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"   
  2.         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  3. <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">  
  4. <head>  
  5. <title>createDelegate测试</title>  
  6.   
  7. <script type="text/javascript" src="javascript/ext-base.js"></script>  
  8. <script type="text/javascript" src="javascript/ext-core.js"></script>  
  9.   
  10.   
  11.   
  12. <script type="text/javascript">  
  13. //<![CDATA[  
  14.  
  15. Ext.onReady(function() {  
  16.     function action_ba(info) {  
  17.         alert(this.dom.innerHTML);  
  18.         alert(info);  
  19.     }  
  20.       
  21.     function action_bb(e,this_,o,info) {  
  22.         alert(this.dom.innerHTML);  
  23.         alert(e.type+'  '+info);  
  24.     }  
  25.       
  26.     function action_bc(info,e) {  
  27.         alert(this.dom.innerHTML);  
  28.         alert(info +'  '+e.type);  
  29.     }  
  30.       
  31.     Ext.get('action_a').on('click',action_ba.createDelegate(Ext.get('action_a'),['自定义参数覆盖event系列参数']));  
  32.  
  33.     Ext.get('action_b').on('click',action_bb.createDelegate(Ext.get('action_b'),['自定义参数在最后'],true));  
  34.       
  35.     Ext.get('action_c').on('click',action_bc.createDelegate(Ext.get('action_c'),['自定义参数在第一位'],0));  
  36.          
  37. });  
  38. //]]>  
  39.   
  40. </script>  
  41.   
  42. </head>  
  43. <body>  
  44.   
  45. <button id='action_a'> 测试覆盖参数</button>  
  46. <button id='action_b'> 测试添加参数</button>  
  47. <button id='action_c'> 测试插入参数</button>  
  48.   
  49.   
  50.   
  51.   
  52.   
  53.   
  54.   
  55. </body>  
  56. </html>  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>createDelegate测试</title>

<script type="text/javascript" src="javascript/ext-base.js"></script>
<script type="text/javascript" src="javascript/ext-core.js"></script>



<script type="text/javascript">
//<![CDATA[

Ext.onReady(function() {
	function action_ba(info) {
		alert(this.dom.innerHTML);
		alert(info);
	}
	
	function action_bb(e,this_,o,info) {
		alert(this.dom.innerHTML);
		alert(e.type+'  '+info);
	}
	
	function action_bc(info,e) {
		alert(this.dom.innerHTML);
		alert(info +'  '+e.type);
	}
	
	Ext.get('action_a').on('click',action_ba.createDelegate(Ext.get('action_a'),['自定义参数覆盖event系列参数']));

	Ext.get('action_b').on('click',action_bb.createDelegate(Ext.get('action_b'),['自定义参数在最后'],true));
	
	Ext.get('action_c').on('click',action_bc.createDelegate(Ext.get('action_c'),['自定义参数在第一位'],0));
       
});
//]]>

</script>

</head>
<body>

<button id='action_a'> 测试覆盖参数</button>
<button id='action_b'> 测试添加参数</button>
<button id='action_c'> 测试插入参数</button>







</body>
</html>
 
附录:Extjs 实现代码

Js代码 复制代码
  1. Function.prototype.createDelegate = function(obj, args, appendArgs){   
  2.         var method = this;   
  3.         return function() {   
  4.             var callArgs = args || arguments;   
  5.             if(appendArgs === true){   
  6.                 callArgs = Array.prototype.slice.call(arguments, 0);   
  7.                 callArgs = callArgs.concat(args);   
  8.             }else if(typeof appendArgs == "number"){   
  9.                 callArgs = Array.prototype.slice.call(arguments, 0);    
  10. // copy arguments first   
  11.                 var applyArgs = [appendArgs, 0].concat(args);    
  12. // create method call params   
  13.                 Array.prototype.splice.apply(callArgs, applyArgs);    
  14. // splice them in   
  15.             }   
  16.             return method.apply(obj || window, callArgs);   
  17.         };   
  18.     }  
Function.prototype.createDelegate = function(obj, args, appendArgs){
        var method = this;
        return function() {
            var callArgs = args || arguments;
            if(appendArgs === true){
                callArgs = Array.prototype.slice.call(arguments, 0);
                callArgs = callArgs.concat(args);
            }else if(typeof appendArgs == "number"){
                callArgs = Array.prototype.slice.call(arguments, 0); 
// copy arguments first
                var applyArgs = [appendArgs, 0].concat(args); 
// create method call params
                Array.prototype.splice.apply(callArgs, applyArgs); 
// splice them in
            }
            return method.apply(obj || window, callArgs);
        };
    }
 
分享到:
评论

相关推荐

    ExtJS 事件笔记

    - **创建代理函数**:使用`createDelegate`方法创建代理函数,可以在不立即执行的情况下指定函数的作用域。 6. **自定义事件参数**: - 通过`scope`参数指定作用域。 - 使用`Function.prototype.createDelegate`...

    ASP.NET AJAX深入浅出系列课程(7):Microsoft AJAX Library对于JavaScript原生对象的扩展(上)

    此外,Microsoft AJAX Library还对Function对象进行了扩展,引入了如createDelegate、extend和implement等方法。createDelegate用于创建一个函数的代理,使得函数可以被调用时保持正确的上下文;extend和implement则...

    C#动态调用DLL并对目标函数传递参数

    4. **创建委托(Delegate)**:由于C#是强类型语言,我们需要创建一个与目标函数签名匹配的委托类型,然后使用`Delegate.CreateDelegate`方法将其与`MethodInfo`关联。 ```csharp // 假设目标函数为无返回值,接受...

    C#动态获取DLL类库文件中的方法并调用

    然后,我们可以通过`Delegate.CreateDelegate`创建一个指向方法的委托,以便于调用: ```csharp MethodInfo methodInfo = type.GetMethod("MethodName"); Delegate del = Delegate.CreateDelegate(typeof(Action), ...

    js解决sharepoint权限问题

    clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed)); } ``` 在 onQuerySucceeded 方法中,我们可以获取当前用户所属的...

    C#各种反射方法源码

    MyDelegate del = (MyDelegate)Delegate.CreateDelegate(typeof(MyDelegate), instance, "MyMethod"); del.DynamicInvoke(); ``` 接下来,关于性能比较。通常,反射比直接静态编译的代码慢,因为它涉及更多的元数据...

    C#反射总结,包括实例和讲解

    Delegate myDelegate = Delegate.CreateDelegate(typeof(Action), instance, "MyEventMethod"); myDelegate.DynamicInvoke(); ``` 总结,C#的反射功能强大且灵活,但应谨慎使用,因为它可能会带来性能开销。在...

    通过反射动态添加菜单C#

    然后,使用`Delegate.CreateDelegate()`方法创建一个指向目标方法的委托实例,并将其关联到菜单项的`Click`事件。 5. **添加到菜单**:最后,将这些菜单项添加到菜单条目或子菜单中。 这个DEMO可能包含一个简单的...

    C#反射网络笔记,反射

    Delegate myDelegate = Delegate.CreateDelegate(typeof(Action), obj, "MyMethod"); myDelegate.DynamicInvoke(new object[] { arg1, arg2 }); ``` 总结,C#反射提供了一种强大且灵活的方式来处理运行时的类型...

    C#Winform动态调用C++和C#的Dll

    Delegate cSharpDel = Delegate.CreateDelegate(typeof(YourCSharpDelegateType), cSharpMethodInfo); cSharpDel.DynamicInvoke(parameters); ``` 以上步骤完成后,你就可以在C# Winform应用中安全地动态调用DLL了...

    Reflex-function-demo.zip_DEMO

    9. **委托创建(Delegate.CreateDelegate)**:反射可以用于创建委托实例,将方法绑定到一个事件处理程序: ```csharp MethodInfo handlerMethod = myType.GetMethod("EventHandlerMethod"); Delegate ...

    Emit学习之旅

    4. **完成并执行**:最后,通过`ILGenerator`的`EndMethod()`方法结束方法定义,然后通过`DynamicMethod`的`CreateDelegate`方法创建委托并执行。 举例来说,以下代码展示了如何使用Emit动态创建一个简单的加法方法...

    浅谈.NET反射机制的性能优化 附实例下载

    概述 本文涉及到的反射优化的途径有如下两种: 通过Delegate.CreateDelegate()创建委托进行优化 通过.NET4的动态运行时进行优化 如果您还知道其他更加有效的优化途径,请不吝赐教! 准备工作 今天我们总计要对比五...

    C#调用系统API详解

    * 委托类型可以使用`Delegate.CreateDelegate`方法来创建委托实例。 3. 成员的传递 在使用系统API时,需要将C#中的类型转换成可以被系统API识别的类型。例如,C#中的字符串类型需要转换成非托管的字符串类型,以便...

    NET 反射的学习源代码

    你可以通过`EventInfo`类来获取和触发事件,通过`Delegate.CreateDelegate()`创建委托实例,实现动态绑定和调用事件处理器。这在处理不固定事件源或事件处理逻辑时非常有效。 另外,反射还可以用于元编程,即在运行...

    C#反射例子.是学习c#反射的好东西

    2. 动态委托:还可以通过Delegate的CreateDelegate方法创建一个指向特定方法的委托,然后通过委托调用方法。 五、访问字段和属性 1. FieldInfo类用于访问字段,通过Type对象的GetField或GetFields方法获取FieldInfo...

Global site tag (gtag.js) - Google Analytics