国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

閱讀Ext學(xué)習(xí)Js(二)extend從繼承說(shuō)起

2024-07-21 02:14:01
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

一般的,如果我們定義一個(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

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 大竹县| 山东省| 焉耆| 建平县| 蒲江县| 三原县| 湟中县| 罗源县| 儋州市| 资阳市| 巴马| 抚州市| 崇阳县| 平武县| 麻栗坡县| 富阳市| 涿州市| 平顺县| 清涧县| 河南省| 家居| 大兴区| 琼结县| 许昌市| 塘沽区| 哈尔滨市| 大理市| 虹口区| 阳新县| 乌鲁木齐市| 绥江县| 锡林郭勒盟| 临清市| 奉化市| 杭州市| 贵州省| 广河县| 天台县| 盐山县| 桐梓县| 弥渡县|