`
yiminghe
  • 浏览: 1428453 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

简析 createDelegate

阅读更多

关于回调函数指定参数问题,由来已久,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的参数运行。



示例使用代码:

<!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 实现代码

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);
        };
    }
 
分享到:
评论
1 楼 howroyal 2011-12-26  
引用
[img][/img][url][/url][flash=200,200][/flash]

相关推荐

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

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

    号称.Net下最快的json组件fastJSON.zip

     c = (CreateObject)dynMethod.CreateDelegate(typeof(CreateObject));  _constrcache.Add(objtype, c);  }  else // structs  {   DynamicMethod dynMethod = new DynamicMethod("_",  Method...

    Ext深入浅出 数据传输

    10.9 关于scope和createDelegate() ....247 10.10 DWR与EXT整合..................................249 10.10.1 在EXT中直接使用DWR......249 10.10.2 DWRProxy............................250 10.10.3 ...

    wheel-0.9.6-py27-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    基于ssm布卡维纳红酒网页平台.zip

    基于ssm布卡维纳红酒网页平台.zip

    基于SSM的旅游管理系统.zip

    基于SSM的旅游管理系统.zip

    菜鸟驿站(诚毅小高层对面厂房内) 2.m4a

    菜鸟驿站(诚毅小高层对面厂房内) 2.m4a

    tensorflow_ranking-0.4.0-py2.py3-none-any.whl

    算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    物联网系统运维,NFS存储部署,NFS软件安装

    物联网系统运维,NFS存储部署,NFS软件安装:查询是否安装,配置好防火墙,以免默认的防火墙策略禁止正常的NFS共享服务。开启防火墙,在NFS服务器上建立用于NFS文件共享的目录,并设置足够的权限确保其他人也有写入权限。在NFS服务器上建立用于NFS文件共享的目录,并设置足够的权限确保其他人也有写入权限。启动和启用NFS服务程序。由于在使用NFS服务进行文件共享之前,需要使用RPC(Remote Procedure Call,远程过程调用)服务将NFS服务器的IP地址和端口号等信息发送给客户端。因此,在启动NFS服务之前,还需要顺带重启并启用rpcbind设置完毕 打开克隆机修改网卡后重启网卡并测试能否联网服务程序,并将这两个服务一并加入开机启动项中。查看服务器共享的文件数据在NFS客户端创建一个挂载目录。使用mount命令并结合-t参数,指定要挂载的文件系统的类型,并在命令后面写上服务器的IP地址、服务器上的共享目录以及要挂载到本地系统(即客户端)的目录。如果希望NFS文件共享服务能一直有效,则需要将其写入到fstab文件中:

    基于java web+ssm的公益网站的设计与实现.zip

    基于java web+ssm的公益网站的设计与实现.zip

    三菱PLC例程源码SFC试验程序

    三菱PLC例程源码SFC试验程序本资源系百度网盘分享地址

    tensorflow_object_detection_api-0.1.1.tar.gz

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    tensorflow_model_optimization-0.4.1.dev0-py2.py3-none-any.whl

    算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    三菱PLC例程源码编码器复位

    三菱PLC例程源码编码器复位本资源系百度网盘分享地址

    asp代码ASP具有动态口令认证机制的网上投票系统的设计(源代码+论文)

    asp代码ASP具有动态口令认证机制的网上投票系统的设计(源代码+论文)本资源系百度网盘分享地址

    DS在生物药物领域的解决方案.pdf

    DS在生物药物领域的解决方案

    asp代码ASP考试成绩分析系统的设计与实现(源代码+论文)

    asp代码ASP考试成绩分析系统的设计与实现(源代码+论文)本资源系百度网盘分享地址

    毕业设计项目,基于深度学习的实时语义分割算法研究,python实现。.zip

    人工智能毕业设计&课程设计

    三菱PLC例程源码粗格栅注解

    三菱PLC例程源码粗格栅注解本资源系百度网盘分享地址

Global site tag (gtag.js) - Google Analytics