Javascript中3種實(shí)現(xiàn)繼承的方法和代碼實(shí)例
繼承是我們在實(shí)現(xiàn)面向?qū)ο缶幊痰臅r(shí)候很重要的一個(gè)手段。雖然我們講不能過度繼承,多利用組合代替繼承,但是繼承總是免不了的。這里要討論的就是Javascript中的繼承機(jī)制。
Javascript中實(shí)際上是沒有繼承的概念的,但是我們可以通過一些手段來模仿實(shí)現(xiàn)它。這種繼承實(shí)際上把一個(gè)對象復(fù)制到另外一個(gè)對象內(nèi)部。你需要注意的是所有的本地類和宿主類是不能作為基類被繼承的,主要是為了安全方面的考慮。
Javascript中的繼承大約有三類:1.對象冒充;2.原型繼承;3.二者的混合。
一、對象冒充
其實(shí)對象冒充是跟this關(guān)鍵字緊密聯(lián)系在一起的(所以說充分理解Javascript中的this關(guān)鍵字是多么的重要:P)。構(gòu)造函數(shù)使用this來給屬性和方法賦值,而構(gòu)造函數(shù)也可以看作為一個(gè)普通的函數(shù),所以我們就可以使我們的基類的構(gòu)造函數(shù)成為子類的構(gòu)造函數(shù),然后在子類的內(nèi)部調(diào)用這個(gè)函數(shù),那么子類就會得到父類的屬性和方法。
原理很簡單,那我們怎么實(shí)現(xiàn)呢?下面就以代碼示例,實(shí)際的操作一下。
對象冒充實(shí)現(xiàn)方法一,我們最常用的新建對象的方法:
var classA = function(name){
this.name = name;
this.alertName = function(){
alert(this.name);
}
}
var classB = function(name,age){
this.myConstructor = classA;
this.myConstructor(name);
delete this.myConstructor;
this.age = age;
this.alertAge = function(){
alert(this.age);
}
}
為了驗(yàn)證以上的方法是否正確,你可以親自測試下,我將測試用的代碼寫在下面:
var objA = new classA('DK');
objA.alertName();//DK
var objB = new classB('DS',20);
objB.alertName();//DS
objB.alertAge();//20
這就是所謂的對象冒充了,另外對象冒充還有另外兩種實(shí)現(xiàn)的方式,雖然它們的實(shí)現(xiàn)手段不一樣,但是它們的原理是一樣的。
對象冒充實(shí)現(xiàn)方法二,使用call方法:
var classA = function(name){
this.name = name;
this.alertName = function(){
alert(this.name);
}
}
var classB = function(name,age){
classA.call(this,name);
this.age = age;
this.alertAge = function(){
alert(this.age);
}
}
通過代碼也能看出來,第一種方法中我們新建了函數(shù)指針指向父類,調(diào)用函數(shù),然后將指針刪除。而這里我們之間用call方法在this對象下面運(yùn)行父類的構(gòu)造函數(shù),實(shí)現(xiàn)了同樣的目的。另外與call方法相對于的則就是apply方法啦。
對象冒充實(shí)現(xiàn)方法三,使用apply方法:
var classA = function(name){
this.name = name;
this.alertName = function(){
alert(this.name);
}
}
var classB = function(name,age){
classA.apply(this,new Array(name));
this.age = age;
this.alertAge = function(){
alert(this.age);
}
}
其實(shí)大家可以看到,apply方法跟call方法是非常類似的,只不過傳遞參數(shù)是略有不同罷了。
二、原型繼承
大家應(yīng)該對prototype對象有所了解,原型對象上的所有屬性和方法將被傳遞給類的所有實(shí)例,所有當(dāng)我們把父類的所有屬性和方法付給子類的prototype對象時(shí)也就相當(dāng)于實(shí)現(xiàn)了我們的繼承。
子類想獲得父類的所有屬性和方法,那我們將父類的一個(gè)實(shí)例直接付給子類的prototype對象,那我們的子類不就相當(dāng)于獲取了父類的所有對象和方法?
代碼示例伺候:
var classA = function(){
this.name = 'DK';
this.alertName = function(){
alert(this.name);
}
}
var classB = function(name,age){
this.name = name;
this.age = age;
}
classB.prototype = new classA();
classB.prototype.alertAge = function(){
alert(this.age);
}
注意這里的父類的構(gòu)造函數(shù)需要確保沒有參數(shù)。因?yàn)榧词褂袠?gòu)造參數(shù)在實(shí)現(xiàn)原型繼承的時(shí)候你也無法傳遞=.=!
三、混合繼承
顧名思義,混合繼承就是前兩種方式的混合使用了。
var classA = function(name){
this.name = name;
}
classA.prototype.alertName = function(){
alert(this.name);
}
var classB = function(name,age){
classA.call(this,name);
this.age = age;
}
classB.prototype = new classA();
classB.prototype.alertAge = function(){
alert(this.age);
}
使用對象冒充實(shí)現(xiàn)了向父類傳遞參數(shù),同時(shí)使用原型繼承實(shí)現(xiàn)了對公有方法的繼承。
說完了這三中繼承方式了,下面該說到問題的時(shí)候了。
你可能會不解,為什么有了對象冒充,有了原型繼承還要再弄出個(gè)什么混合繼承,對,最重要的也就是這個(gè)問題。
1.如果你實(shí)際測試一下,你會發(fā)現(xiàn)通過對象冒充的方式實(shí)現(xiàn)的繼承,子類是無法訪問到父類的原型鏈上的方法的。
2.而用原型繼承,則會把所有的屬性變成共享的屬性,如果你同一個(gè)子類實(shí)現(xiàn)兩個(gè)實(shí)例,你會發(fā)現(xiàn)你的所有實(shí)例共享所有的屬性。
3.但是這肯定是不合適的了。所以就有了混合繼承的方式,讓屬性繼續(xù)保持私有,同時(shí)讓子類能夠訪問父類的原型鏈的方法。
你可以親自動(dòng)手試一下,在對象冒充繼承的時(shí)候,子類無法訪問父類的原型鏈方法,原型鏈繼承子類的所有實(shí)例共享所有父類屬性。這里我就不寫例子了。
相關(guān)文章
JavaScript的垃圾回收機(jī)制與內(nèi)存管理
這篇文章主要介紹了JavaScript的垃圾回收機(jī)制與內(nèi)存管理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
自動(dòng)完成的搜索框javascript實(shí)現(xiàn)
這篇文章主要介紹了自動(dòng)完成的搜索框javascript實(shí)現(xiàn)代碼,感興趣的小伙伴們可以參考一下2016-02-02
微信小程序使用input組件實(shí)現(xiàn)密碼框功能【附源碼下載】
這篇文章主要介紹了微信小程序使用input組件實(shí)現(xiàn)密碼框功能,涉及input組件布局設(shè)置相關(guān)操作技巧,并附帶源碼供讀者下載參考,需要的朋友可以參考下2017-12-12
js實(shí)現(xiàn)二級菜單點(diǎn)擊顯示當(dāng)前內(nèi)容效果
這篇文章主要介紹了js實(shí)現(xiàn)二級菜單點(diǎn)擊顯示當(dāng)前內(nèi)容效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
JS事件監(jiān)聽與事件委托舉例詳解(前端小白必學(xué))
在JavaScript的學(xué)習(xí)中我們經(jīng)常會遇到JavaScript的事件機(jī)制,例如,事件綁定、事件監(jiān)聽、事件委托(事件代理)等,下面這篇文章主要給大家介紹了關(guān)于JS事件監(jiān)聽與事件委托的相關(guān)資料,需要的朋友可以參考下2024-07-07
JavaScript安全加密之禁止別人調(diào)試自己的前端頁面代碼實(shí)現(xiàn)
這篇文章主要為大家介紹了JavaScript安全加密之如何禁止別人調(diào)試自己的前端頁面代碼實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08

