Javascript 理解Ext.extend以及为什么在没有新函数的情况下将超类作为函数调用
我很难理解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(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”是一个[新的]超类对象——我自己实际上并不是这方面的专家。如果还不清楚,请告诉我。我将尝试用引用的信息进行完整的解释。