亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Javascript中3種實現(xiàn)繼承的方法和代碼實例

 更新時間:2014年08月12日 10:55:38   投稿:junjie  
這篇文章主要介紹了Javascript中3種實現(xiàn)繼承的方法和代碼實例,這3種方法分別為對象冒充、原型繼承、上二者的混合,需要的朋友可以參考下

繼承是我們在實現(xiàn)面向?qū)ο缶幊痰臅r候很重要的一個手段。雖然我們講不能過度繼承,多利用組合代替繼承,但是繼承總是免不了的。這里要討論的就是Javascript中的繼承機(jī)制。

Javascript中實際上是沒有繼承的概念的,但是我們可以通過一些手段來模仿實現(xiàn)它。這種繼承實際上把一個對象復(fù)制到另外一個對象內(nèi)部。你需要注意的是所有的本地類和宿主類是不能作為基類被繼承的,主要是為了安全方面的考慮。

Javascript中的繼承大約有三類:1.對象冒充;2.原型繼承;3.二者的混合。

一、對象冒充

其實對象冒充是跟this關(guān)鍵字緊密聯(lián)系在一起的(所以說充分理解Javascript中的this關(guān)鍵字是多么的重要:P)。構(gòu)造函數(shù)使用this來給屬性和方法賦值,而構(gòu)造函數(shù)也可以看作為一個普通的函數(shù),所以我們就可以使我們的基類的構(gòu)造函數(shù)成為子類的構(gòu)造函數(shù),然后在子類的內(nèi)部調(diào)用這個函數(shù),那么子類就會得到父類的屬性和方法。

原理很簡單,那我們怎么實現(xiàn)呢?下面就以代碼示例,實際的操作一下。

對象冒充實現(xiàn)方法一,我們最常用的新建對象的方法:

復(fù)制代碼 代碼如下:

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);
 }
}

為了驗證以上的方法是否正確,你可以親自測試下,我將測試用的代碼寫在下面:

復(fù)制代碼 代碼如下:

var objA = new classA('DK');
objA.alertName();//DK
 
var objB = new classB('DS',20);
 
objB.alertName();//DS
objB.alertAge();//20

這就是所謂的對象冒充了,另外對象冒充還有另外兩種實現(xiàn)的方式,雖然它們的實現(xiàn)手段不一樣,但是它們的原理是一樣的。

對象冒充實現(xiàn)方法二,使用call方法:

復(fù)制代碼 代碼如下:

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對象下面運行父類的構(gòu)造函數(shù),實現(xiàn)了同樣的目的。另外與call方法相對于的則就是apply方法啦。

對象冒充實現(xiàn)方法三,使用apply方法:

復(fù)制代碼 代碼如下:

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);
 }
}

其實大家可以看到,apply方法跟call方法是非常類似的,只不過傳遞參數(shù)是略有不同罷了。

二、原型繼承

大家應(yīng)該對prototype對象有所了解,原型對象上的所有屬性和方法將被傳遞給類的所有實例,所有當(dāng)我們把父類的所有屬性和方法付給子類的prototype對象時也就相當(dāng)于實現(xiàn)了我們的繼承。

子類想獲得父類的所有屬性和方法,那我們將父類的一個實例直接付給子類的prototype對象,那我們的子類不就相當(dāng)于獲取了父類的所有對象和方法?

代碼示例伺候:

復(fù)制代碼 代碼如下:

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ù)。因為即使有構(gòu)造參數(shù)在實現(xiàn)原型繼承的時候你也無法傳遞=.=!

三、混合繼承

顧名思義,混合繼承就是前兩種方式的混合使用了。

復(fù)制代碼 代碼如下:

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);
}

使用對象冒充實現(xiàn)了向父類傳遞參數(shù),同時使用原型繼承實現(xiàn)了對公有方法的繼承。

說完了這三中繼承方式了,下面該說到問題的時候了。

你可能會不解,為什么有了對象冒充,有了原型繼承還要再弄出個什么混合繼承,對,最重要的也就是這個問題。

1.如果你實際測試一下,你會發(fā)現(xiàn)通過對象冒充的方式實現(xiàn)的繼承,子類是無法訪問到父類的原型鏈上的方法的。

2.而用原型繼承,則會把所有的屬性變成共享的屬性,如果你同一個子類實現(xiàn)兩個實例,你會發(fā)現(xiàn)你的所有實例共享所有的屬性。

3.但是這肯定是不合適的了。所以就有了混合繼承的方式,讓屬性繼續(xù)保持私有,同時讓子類能夠訪問父類的原型鏈的方法。

你可以親自動手試一下,在對象冒充繼承的時候,子類無法訪問父類的原型鏈方法,原型鏈繼承子類的所有實例共享所有父類屬性。這里我就不寫例子了。

相關(guān)文章

  • JavaScript實現(xiàn)旋轉(zhuǎn)輪播圖

    JavaScript實現(xiàn)旋轉(zhuǎn)輪播圖

    這篇文章主要為大家詳細(xì)介紹了JavaScript實現(xiàn)旋轉(zhuǎn)輪播圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 前端js中的事件循環(huán)eventloop機(jī)制詳解

    前端js中的事件循環(huán)eventloop機(jī)制詳解

    這篇文章主要給大家介紹了關(guān)于前端js中事件循環(huán)eventloop機(jī)制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用js具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • JavaScript數(shù)組reduce()方法的語法與實例解析

    JavaScript數(shù)組reduce()方法的語法與實例解析

    js函數(shù)中有三個在特定場合很好用的函數(shù):reduce(),map(),filter(),這篇文章主要給大家介紹了關(guān)于JavaScript數(shù)組reduce()方法的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • JavaScript在瀏覽器中的執(zhí)行機(jī)制

    JavaScript在瀏覽器中的執(zhí)行機(jī)制

    既然說到了JavaScript,那么就會繞不過去執(zhí)行上下文,只有理解了執(zhí)行上下文才能更好的理解JavaScript本身,不過本部分不是專門講解?JavaScript的,主要從JavaScript的執(zhí)行順序開始介紹一下JavaScript是怎樣運行的
    2023-09-09
  • 小程序云函數(shù)調(diào)用API接口的方法

    小程序云函數(shù)調(diào)用API接口的方法

    這篇文章主要為大家詳細(xì)介紹了小程序云函數(shù)調(diào)用API接口的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • BootStrap Table對前臺頁面表格的支持實例講解

    BootStrap Table對前臺頁面表格的支持實例講解

    bootstrap-table是在bootstrap的基礎(chǔ)上面做了一些封裝,所以在使用bootstrap-table之前要導(dǎo)入的js和css,下面通過本文給大家詳細(xì)介紹需要引入的文件,對bootstrap table 表格感興趣的朋友一起看看吧
    2016-12-12
  • Javascript中的this,bind和that使用實例

    Javascript中的this,bind和that使用實例

    這篇文章主要介紹了Javascript中的this,bind和that使用實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • 微信小程序?qū)崿F(xiàn)電子簽名功能

    微信小程序?qū)崿F(xiàn)電子簽名功能

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)電子簽名功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • javascript實現(xiàn)鼠標(biāo)點擊生成文字特效

    javascript實現(xiàn)鼠標(biāo)點擊生成文字特效

    這篇文章主要為大家詳細(xì)介紹了javascript實現(xiàn)鼠標(biāo)點擊生成文字特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • JS使用canvas中的measureText方法測量字體寬度示例

    JS使用canvas中的measureText方法測量字體寬度示例

    這篇文章主要介紹了JS使用canvas中的measureText方法測量字體寬度,結(jié)合實例形式分析了canvas的measureText方法相關(guān)使用技巧,需要的朋友可以參考下
    2019-02-02

最新評論