Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 理解Ext.extend以及为什么在没有新函数的情况下将超类作为函数调用_Javascript_Extjs - Fatal编程技术网

Javascript 理解Ext.extend以及为什么在没有新函数的情况下将超类作为函数调用

Javascript 理解Ext.extend以及为什么在没有新函数的情况下将超类作为函数调用,javascript,extjs,Javascript,Extjs,我很难理解Ext.extend函数的实现 它支持两种语法 Ext.extend(extendedClass、基类、重写) extendedClass=Ext.extend(基类,重写) 所以它规范化了参数,就像这样 var oc = Object.prototype.constructor; function(sb, sp, overrides){ if(Ext.isObject(sp)){ overrides = sp;

我很难理解Ext.extend函数的实现

它支持两种语法

Ext.extend(extendedClass、基类、重写)

extendedClass=Ext.extend(基类,重写)

所以它规范化了参数,就像这样

    var oc = Object.prototype.constructor;
    function(sb, sp, overrides){
        if(Ext.isObject(sp)){
            overrides = sp;
            sp = sb;
            sb = overrides.constructor != oc ? 
            overrides.constructor : 
            function(){sp.apply(this, arguments);};
我不明白的是,如果没有传入,如何创建
sb

它检查
覆盖
是否为配置{}

>>> overrides = {a:1,b:2}
Object { a=1,b=2}
>>> overrides.constructor === Object.prototype.constructor
true
如果不是,则extendedClass设置为
覆盖。构造函数

否则,extendedClass是
function(){sp.apply(这是参数)

我了解了调用构造函数时使用或不使用
new

但是,如果在
function(){…}
中不使用
new
键盘而将整个
参数
传递到基类,那么将基类作为函数调用意味着什么呢

谢谢

整个函数如下所示

Ext.extend = function(){
    // inline overrides
    var io = function(o){
        for(var m in o){
            this[m] = o[m];
        }
    };
    var oc = Object.prototype.constructor;

    return function(sb, sp, overrides){
        if(Ext.isObject(sp)){
            overrides = sp;
            sp = sb;
            sb = overrides.constructor != oc ? 
            overrides.constructor : 
            function(){sp.apply(this, arguments);};
        }
        var F = function(){},
            sbp,
            spp = sp.prototype;

        F.prototype = spp;
        sbp = sb.prototype = new F();
        sbp.constructor=sb;
        sb.superclass=spp;
        if(spp.constructor == oc){
            spp.constructor=sp;
        }
        sb.override = function(o){
            Ext.override(sb, o);
        };
        sbp.superclass = sbp.supr = (function(){
            return spp;
        });
        sbp.override = io;
        Ext.override(sb, overrides);
        sb.extend = function(o){return Ext.extend(sb, o);};
        return sb;
    };
}();

奇怪的是,据我所知,你是否传入“sb”并不重要。它始终是return。看到底部的“return sb”了吗?因此,如果你传入了一个变量,你会得到一个对sb的引用。如果你没有传入,你会得到对sb的“returned”引用。对于“作为没有new关键字的函数调用基类意味着什么?”:实际上有一个新的关键字,如果你仔细看,你会看到“new F()”,其中“F”有“spp”的原型,这里又有“sp”的原型(它是超类)。简言之,“F”有超类的原型。你还会看到“sb.prototype=new F()”——所以“sb”是一个[新的]超类对象——我自己实际上并不是这方面的专家。如果还不清楚,请告诉我。我将尝试用引用的信息进行完整的解释。