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; }; } });
?