论坛首页 Web前端技术论坛

浅析Ext为Function扩展的五个方法

浏览 1804 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-04-27  
    今天有兴趣查看了Ext的源码,就来浅析下Ext为Function扩展的五个方法吧!
    首先来分析下createInterceptor,api是这么说的“创建一个拦截器函数,当该拦截器函数返回true时则执行原函数,否则不执行。”,首先看下它到源码:

createInterceptor : function(fcn, scope){
        var method = this;
        return !Ext.isFunction(fcn) ?
                this :
                function() {
                    var me = this,
                        args = arguments;
                    fcn.target = me;
                    fcn.method = method;
                    return (fcn.apply(scope || me || window, args) !== false) ?
                            method.apply(me || window, args) :
                            null;
                };
    }


从源码可以看出该函数有两个参数,第一过参数就是拦截器的函数,第二个参数则是作用域。我们看下这段代码:
fcn.apply(scope || me || window, args)

其中fcn就是该拦截器函数需要返回true或false,所以当返回true时则执行函数本身,否则就返回null了。


createCallback,当执行到回调函数需要传入参数时,你就必需调用该方法,该方法的当前域是window对象,如果你需要传入当前域就应当使用createDelegate方法。我们看下下面这段代码就可以很容易理解了:
var sayHi = function(name){
    alert('Hi, ' + name);
}

// clicking the button alerts "Hi, Fred"
new Ext.Button({
    text: 'Say Hi',
    renderTo: Ext.getBody(),
    handler: sayHi.createCallback('Fred')
});


如果sayHi这过函数不需要传入参数,那么handler就可以直接使用sayHi函数了。


createDelegate,简单到说就是改变原函数到当前域,由第一过参数来指定,第二个参数是数组类型的,是原函数的参数,此外还有第三个参数,因为没什么用到,这里就不多说了。


defer,从源码可以知道,他对原函数提供了延迟处理。


createSequence,创建一过函数系列,第一个参数传入函数,第二个参数为传入到当前域,该参数只当做第一个参数的当前域。通过创建函数系列可以在执行原函数之前执行一些其他操作。

论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics