一般的,如果我們定義一個(gè)類(lèi),會(huì)定義一個(gè)function對(duì)象,然后將公用方法寫(xiě)到其原型上,例如:
var Tiger = function(){}
Tiger.prototype.Hunting = function(){}
但是要建立一個(gè)完善的框架或者類(lèi)庫(kù),沒(méi)有繼承幫忙,組織代碼將是一件非常辛苦且難以管理的工作。Js中的類(lèi)是function對(duì)象,實(shí)現(xiàn)繼承,主要要將子類(lèi)的原型設(shè)置為父類(lèi)的一個(gè)實(shí)例(這樣子類(lèi)就用有了父類(lèi)原型的所有成員),并重新將子類(lèi)原型的構(gòu)造器設(shè)置為子類(lèi)自己。如以下代碼所示:
function Animal(){}
function Tiger(){}
Tiger.prototype = new Animal()
Tiger.prototype.constructor = Tiger
實(shí)現(xiàn)繼承并不難,將上面的Animal和Tiger參數(shù)化封裝為一個(gè)方法就可以實(shí)現(xiàn)(當(dāng)然實(shí)際應(yīng)用中就要復(fù)制一些了),代碼如下:
function Extend(subFn, superFn){
subFn.prototype = new superFn()
subFn.prototype.constructor = subFn
}
Ext作為一個(gè)優(yōu)秀的框架,當(dāng)然也少不了繼承的實(shí)現(xiàn)。如前一篇文章所談到的,現(xiàn)在讓我們一行行代碼理解Ext.extend
extend : function(){
// inline overrides
var io = function(o){
for(var m in o){
this[m] = o[m];
}
};
return function(sb, sp, overrides){
if(typeof sp == 'object'){
overrides = sp;
sp = sb;
sb = 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 == Object.prototype.constructor){
spp.constructor=sp;
}
sb.override = function(o){
Ext.override(sb, o);
};
sbp.override = io;
Ext.override(sb, overrides);
return sb;
};
}()
本來(lái)只有兩行代碼就可以實(shí)現(xiàn)的繼承變成了近30行,Ext都做了什么呢?通常情況下只傳入兩個(gè)類(lèi)型的話(subFn和superFn),上面的代碼將簡(jiǎn)化為
extend : function(){
// inline overrides
var io = function(o){
for(var m in o){
this[m] = o[m];
}
};
return function(sb, sp, overrides){
var F = function(){}, sbp, spp = sp.prototype;
F.prototype = spp;
sbp = sb.prototype = new F();
sbp.constructor=sb;
sb.superclass=spp;
sb.override = function(o){
Ext.override(sb, o);
};
sbp.override = io;
Ext.override(sb, overrides);
return sb;
};
}()
定義一個(gè)空函數(shù),將其原型設(shè)置為sp的原型spp,其實(shí)F就是sp的一個(gè)替身,理解的時(shí)候可以認(rèn)為就是sp。將子類(lèi)sb的原型設(shè)置為F的一個(gè)實(shí)例,然后再將其原型的構(gòu)造器設(shè)置為自己sb,為了方便找到父類(lèi)sp,在子類(lèi)sb上添加了一個(gè)superclass屬性為父類(lèi)sp的原型spp。為了方便擴(kuò)展屬性,在子類(lèi)sb上添加了屬性重寫(xiě)的override方法,也在其原型上添加了override方法(這樣其所有實(shí)例對(duì)象就可以從一個(gè)對(duì)象重寫(xiě)現(xiàn)有屬性了)。
到這里算是對(duì)繼承有了一些了解(不到位的地方在以后的閱讀中繼續(xù)加強(qiáng))。好了,有了繼承的支持,我們就可以加速類(lèi)型的擴(kuò)展了。
繼續(xù) 閱讀Ext 學(xué)習(xí)Javascript(三) Event和Observeable
新聞熱點(diǎn)
疑難解答
圖片精選