最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

原生Javascript實(shí)現(xiàn)繼承方式及其優(yōu)缺點(diǎn)詳解

 更新時(shí)間:2021年07月21日 11:32:40   作者:ClarenceEz  
JS作為面向?qū)ο蟮娜躅愋驼Z言,繼承也是其非常強(qiáng)大的特性之一,那么這篇文章主要給大家介紹了關(guān)于原生Javascript實(shí)現(xiàn)繼承方式及其優(yōu)缺點(diǎn)的相關(guān)資料,需要的朋友可以參考下

前言

最近在復(fù)習(xí)javascript的一些基礎(chǔ)知識,為開啟新的征程做準(zhǔn)備。所以開始記錄一些自己學(xué)習(xí)的內(nèi)容。

那今天的主題是 js的原生繼承方式

廢話少說,上代碼!

首先是我們的父類代碼。

在這里我們創(chuàng)建一個(gè)Person的類作為父類,它的構(gòu)造函數(shù)需要2個(gè)參數(shù)name和age。

然后我們在它的原型上添加一個(gè)sayHi的方法。

//父類
function Person (name, age) {
    this.name = name || 'no name';
    this.age = age || 0;
}

Person.prototype.sayHi = function () {
    console.log('Hi, I\'m ' + this.name + ' and i\'m ' + this.age + ' years old!');
}

var p = new Person('A',20);
p.sayHi();//Hi, I'm A and i'm 20 years old!

原型繼承

//原型繼承
function Teacher(){
}

Teacher.prototype=new Person('B',22);
Teacher.prototype.constructor=Teacher;

var t = new Teacher();
t.sayHi();//Hi, I'm B and i'm 22 years old!
console.log(t instanceof Person);//true
console.log(t instanceof Teacher);//true

優(yōu)點(diǎn)

從上面的代碼來看,Teacher 的實(shí)例擁有了 Person 的屬性和方法。并且實(shí)例對象既是 Person的實(shí)例也是 Teacher的實(shí)例。而且這種繼承方式特別的簡單。

缺點(diǎn)

我們可以很容易的就發(fā)現(xiàn)Teacher類的 name和 age是固定的,都是name=B和age=22,換句話說就是我們無法實(shí)現(xiàn)按照我們的意愿給父類的構(gòu)造函數(shù)傳參。并且一個(gè)我們不能給一個(gè) Teacher 指定多個(gè)原型,也就是沒法 多繼承。然后我們看下下面這段代碼:

var t1 = new Teacher();
var t2 = new Teacher();
Teacher.prototype.name = "C";
t1.sayHi();//Hi, I'm C and i'm 22 years old!
t2.sayHi();//Hi, I'm C and i'm 22 years old!

上面這段代碼中我們可以看到當(dāng)原型中的屬性或者方法被改變時(shí),所有的子類實(shí)例的屬性和方法也會跟著被改變,也就是原型繼承的另一個(gè)缺點(diǎn):所有子類共享同一個(gè)原型對象

這里說到了原型,我很早之前也寫過一個(gè)關(guān)于原型的隨筆,不過可能也是有些模糊,現(xiàn)在的理解和當(dāng)時(shí)有所不同,我會在后面重新寫一篇關(guān)于原型的隨筆。(寫好了我會附上連接)

構(gòu)造函數(shù)繼承

//構(gòu)造函數(shù)繼承
function Teacher (name, age) {
    Person.call(this, name, age);
}

var t1 = new Teacher('B', 22);
var t2 = new Teacher('C', 30);
console.log(t1.name);//B
console.log(t2.name);//C
console.log(t1 instanceof Person);//false
console.log(t1 instanceof Teacher);//true
t1.sayHi();//TypeError: t1.sayHi is not a function
t2.sayHi();//TypeError: t1.sayHi is not a function

優(yōu)點(diǎn)

相對于 原型繼承 , 構(gòu)造函數(shù)繼承解決了所有的子類實(shí)例共享統(tǒng)一原型的問題,也可以給父類的構(gòu)造函數(shù)傳參,并且我們可以在子類的構(gòu)造函數(shù)中調(diào)用多個(gè)父類的構(gòu)造函數(shù),實(shí)現(xiàn)所謂的多繼承(這里的多繼承是指子類通過call,apply等方法去調(diào)用父類的構(gòu)造函數(shù)使其擁有父類的屬性和方法,但是js中一個(gè)函數(shù)對象只存在一個(gè) prototype,所以其實(shí)我們沒法通過原型鏈的形式去體現(xiàn)出多繼承)

缺點(diǎn)

上面的代碼中我們可以看出創(chuàng)建的實(shí)例只是 子類的實(shí)例 并不是 父類的實(shí)例 ,不能直觀的體現(xiàn)出繼承,這種繼承方式也無法繼承父類的原型上的屬性和方法。

組合式繼承

//組合式繼承
function Teacher (name, age) {
    Person.call(this, name, age);
}

Teacher.prototype = new Person();
Teacher.prototype.constructor = Teacher;


var t1 = new Teacher('B', 22);
var t2 = new Teacher('C', 30);
Teacher.prototype.name = "D";
console.log(t1.name);//B
console.log(t2.name);//C
t1.sayHi();//Hi, I'm B and i'm 22 years old!
t2.sayHi();//Hi, I'm C and i'm 30 years old!
console.log(t1 instanceof Person);//true
console.log(t1 instanceof Teacher);//true

組合式繼承就是結(jié)合了原型繼承和構(gòu)造函數(shù)繼承的優(yōu)點(diǎn),解決了兩種方式存在的一些缺點(diǎn)。但是我們會發(fā)現(xiàn)每當(dāng)我們?nèi)?chuàng)建一個(gè)子類實(shí)例的時(shí)候都會去創(chuàng)建一個(gè)父類的實(shí)例,盡管父類實(shí)例不是同一個(gè)實(shí)例(內(nèi)存地址不一樣),但是他們其實(shí)屬性和方法上完全一致,所以我們通過下面這種(寄生式組合繼承)方式完善它,以避免不必要的實(shí)例構(gòu)造。

寄生式組合繼承

//寄生式組合繼承
function Teacher (name, age) {
    Person.call(this, name, age);
}

Teacher.prototype = Object.create(Person.prototype);
Teacher.prototype.constructor = Teacher;


var t1 = new Teacher('B', 22);
var t2 = new Teacher('C', 30);
Teacher.prototype.name = "D";
console.log(t1.name);//B
console.log(t2.name);//C
t1.sayHi();//Hi, I'm B and i'm 22 years old!  
t2.sayHi();//Hi, I'm C and i'm 30 years old!
console.log(t1 instanceof Person);//true
console.log(t1 instanceof Teacher);//true 

上面的方式解決了我們沒創(chuàng)建一個(gè)子類實(shí)例都去創(chuàng)建一個(gè)父類實(shí)例的問題,這也是最為常用的一種js的繼承方式,如果我們通過Babel去把ES6中的class的繼承轉(zhuǎn)成ES5的代碼,我們會發(fā)現(xiàn)就是用的寄生式組合繼承。

總結(jié)

到此這篇關(guān)于原生Javascript實(shí)現(xiàn)繼承方式及其優(yōu)缺點(diǎn)的文章就介紹到這了,更多相關(guān)原生Javascript繼承方式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 微信小程序開發(fā)問題之wx.previewImage

    微信小程序開發(fā)問題之wx.previewImage

    這篇文章主要給大家介紹了關(guān)于微信小程序開發(fā)問題之wx.previewImage的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • 淺談JavaScript中運(yùn)算符的優(yōu)先級

    淺談JavaScript中運(yùn)算符的優(yōu)先級

    這篇文章主要給大家簡單介紹了JavaScript中運(yùn)算符的優(yōu)先級的相關(guān)問題,十分的實(shí)用,有需要的小伙伴可以參考下。
    2015-07-07
  • 詳解ES6數(shù)組方法find()、findIndex()的總結(jié)

    詳解ES6數(shù)組方法find()、findIndex()的總結(jié)

    這篇文章主要介紹了詳解ES6數(shù)組方法find()、findIndex()的總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 實(shí)現(xiàn)網(wǎng)頁內(nèi)容水平或垂直滾動的Javascript代碼

    實(shí)現(xiàn)網(wǎng)頁內(nèi)容水平或垂直滾動的Javascript代碼

    用Javascript實(shí)現(xiàn)新聞內(nèi)容的水平或垂直滾動,主要的優(yōu)點(diǎn)是我們可以實(shí)現(xiàn)自定義滾動風(fēng)格或特效,應(yīng)用效果比起傳統(tǒng)的marquee更加具有特色,方法也比較簡單
    2012-10-10
  • JavaScript實(shí)現(xiàn)京東秒殺效果

    JavaScript實(shí)現(xiàn)京東秒殺效果

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)京東秒殺效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • JS中promise特點(diǎn)與信任問題解決

    JS中promise特點(diǎn)與信任問題解決

    大家都知道Promise解決了回調(diào)地獄的問題,“回調(diào)地獄”所說的嵌套其實(shí)是指異步的嵌套,它帶來了兩個(gè)問題:可讀性的問題和信任問題,下面這篇文章主要給大家介紹了關(guān)于JS中promise特點(diǎn)與信任問題解決的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • JavaScript中Cookie的使用之如何設(shè)置失效時(shí)間

    JavaScript中Cookie的使用之如何設(shè)置失效時(shí)間

    這篇文章主要介紹了JavaScript中Cookie的使用之如何設(shè)置失效時(shí)間問題,具有很好的參考價(jià)值,希望對大家有所幫助。
    2022-12-12
  • javascript 定義初始化數(shù)組函數(shù)

    javascript 定義初始化數(shù)組函數(shù)

    有段javascript代碼很困惑,經(jīng)過不斷的查資料,終于弄懂了!呵呵!
    2009-09-09
  • JavaScript高級編程之Array的用法總結(jié)

    JavaScript高級編程之Array的用法總結(jié)

    這篇文章主要為大家介紹了JavaScript中Array常見用法的總結(jié),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-11-11
  • JS實(shí)現(xiàn)超簡單的仿QQ折疊菜單效果

    JS實(shí)現(xiàn)超簡單的仿QQ折疊菜單效果

    這篇文章主要介紹了JS實(shí)現(xiàn)超簡單的仿QQ折疊菜單效果,可實(shí)現(xiàn)鼠標(biāo)滑過列表展開的QQ折疊菜單效果,非常簡單實(shí)用,需要的朋友可以參考下
    2015-09-09

最新評論

封开县| 邢台县| 浮山县| 鄂尔多斯市| 鸡泽县| 榕江县| 贵德县| 安吉县| 句容市| 赤城县| 绵阳市| 恩施市| 湛江市| 绥宁县| 湖南省| 灯塔市| 凌云县| 阿尔山市| 双辽市| 兴安盟| 江津市| 区。| 克山县| 明溪县| 从化市| 枞阳县| 扬州市| 古交市| 谢通门县| 东丽区| 芮城县| 汉中市| 池州市| 石景山区| 高雄市| 广东省| 阿拉善盟| 周宁县| 荆州市| 青海省| 乐亭县|