Ext中的createdelegate()方法

1.call是js自带的方法,长在Function对象上

function b(v){
   alert(this.temp+" "+v);
} 
b.call({temp:'abc'},'hello');
第一个参数是给b  function的this作用域赋值,后面那个是b 的参数

2.createDelegate()是Ext自己扩展的方法,同样是长在Function对象上的,这个方法的作用是返回一个匿名方法的引用,通常用来改变作用域

function b(v){
   alert(this.temp+" "+v);
}
Function.prototype.createDelegate=function(scope,params){
var _fun = this;
return function(){
_fun.apply(scope,params);
};

}
var fun = b.createDelegate({temp:'abc'},['hello']);
fun(); 

关于回调函数指定参数问题,由来已久,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 >   
 
附录: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.     } 

                            

你可能感兴趣的:(delegate)