首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

[ExtJS3.2源码每日一小时]ExtJS对Function类的扩展

2013-08-10 
[ExtJS3.2源码每天一小时]ExtJS对Function类的扩展Ext对Function类的扩展主要包括方法:常见函数执行拦截器

[ExtJS3.2源码每天一小时]ExtJS对Function类的扩展

Ext对Function类的扩展主要包括方法:常见函数执行拦截器、创建回调函数、延迟函数执行。 Java代码  Ext.apply(Function.prototype, {     //函数执行拦截器 fcn-拦截器函数    createInterceptor: function(fcn, scope){          //this指代当前要加拦截器的function 下文简称this函数          var method = this;          //判断当前fcn拦截器是否是一个函数,如果是返回的是执行拦截器和this函数的一个新函数,如果不是返回的是this函数。          return !Ext.isFunction(fcn) ?                  this :                  //下面这个function称作deal函数(依次执行拦截函数和this函数)                  function() {                      //此处的this指的是deal函数                      var me = this,                      //arguments指代deal函数的参数                      args = arguments;                      //设置拦截器的拦截目标为deal函数                      fcn.target = me;                      //设置拦截器的正常方法为this函数                      fcn.method = method;                      //首先执行拦截器,如果拦截器不返回false,那么继续执行this函数,如果拦截器返回false,那么this函数将不执行。                      return (fcn.apply(scope || me || window, args) !== false) ?                              method.apply(me || window, args) :                              null;                  };      },     //创建function特定参数的回调函数     createCallback: function(){          var args = arguments,              method = this;          return function() {              return method.apply(window, args);          };      },      //创建function指定参数的回调函数       //obj指代的是作用域       //args指代的是要回传给执行函数的参数,一旦指定args,并且appendArgs不传,那么就覆盖原有函数的参数;       //appendArgs可以传两种类型 布尔值:代表是否追加参数 数字值:代表追加的位置     createDelegate: function(obj, args, appendArgs){          //保存当前函数的引用          var method = this;          return function() {              //声明回调时传入的参数              var callArgs = args || arguments;              //是否追加参数,即createDelegate传的args参数是否追加到当调用回调函数时传入的参数数组里面              if (appendArgs === true){                  //先将回调函数的参数转为数组形式,因为arguments并不是一个数组                  callArgs = Array.prototype.slice.call(arguments, 0);                  //将args参数追加到回调参数中                  callArgs = callArgs.concat(args);              }              //如果appendArgs是数字              else if (Ext.isNumber(appendArgs)){                  //先将回调函数的参数转为数组形式,因为arguments并不是一个数组                  callArgs = Array.prototype.slice.call(arguments, 0);                   //从appendArgs位置向callArgs插入args参数                  var applyArgs = [appendArgs, 0].concat(args);                   Array.prototype.splice.apply(callArgs, applyArgs); // splice them in              }              //执行函数              return method.apply(obj || window, callArgs);          };      },      //延迟执行函数       //millis:延迟执行的毫秒数       //obj:作用域       //args:创建回调函数的参数       //appendArgs:是否追加参数     defer: function(millis, obj, args, appendArgs){          //创建回调函数          var fn = this.createDelegate(obj, args, appendArgs);          //应用延迟          if(millis > 0){              //millis后执行fn              return setTimeout(fn, millis);          }          //如果millis小于零或者是其他非数字值,直接执行fn          fn();          return 0;      },      //创建函数之后顺序执行的一个函数      createSequence : function(fcn, scope){          var method = this;          return (typeof fcn != 'function') ?                  this :                  function(){                      var retval = method.apply(this || window, arguments);                      fcn.apply(scope || this || window, arguments);                      return retval;                  };      }  });  

?

热点排行