如何理解es6中的class,以及class中的constructor函數(shù)

首先,“語法糖”的意思是現(xiàn)有技術(shù)本可以實(shí)現(xiàn),但是采用某種寫法會(huì)更加簡潔優(yōu)雅。最常見的就是聲明對(duì)象采用的就是語法糖 var a={b:111}。
ES6的class可以看作只是一個(gè)語法糖,它的絕大部分功能,ES5都可以做到,新的class寫法只是讓對(duì)象原型的寫法更加清晰、更像面向?qū)ο缶幊痰恼Z法而已。

function Point(x, y) {
this.x = x;
this.y = y;
}

Point.prototype.toString = function () {
return '(' + this.x + ', ' + this.y + ')';
};
等同于

class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}

toString() {
return '(' + this.x + ', ' + this.y + ')';
}
}
在constructor中必須調(diào)用 super方法,子類沒有自己的this對(duì)象,而是繼承父類的this對(duì)象,然后對(duì)其進(jìn)行加工。super代表了父類構(gòu)造函數(shù)。對(duì)于你的實(shí)例相當(dāng)于執(zhí)行Component(props)。但是注意,此處this指向 子類。更嚴(yán)謹(jǐn)?shù)氖窍喈?dāng)于

Component.prototype.constructor.call(this,props)。
至于為什么一定要有super?可以很容易想得到,先有父才有子嘛。super繼承父類屬性,在constructor中進(jìn)行自己的改造。

另一個(gè)例子

假設(shè)在es5要實(shí)現(xiàn)繼承,首先定義一個(gè)父類:

//父類
function sup(name) {
this.name = name
}
//定義父類原型上的方法
sup.prototype.printName = function (){
console.log(this.name)
}
現(xiàn)在再定義他sup的子類,繼承sup的屬性和方法:

function sub(name,age){
sup.call(this,name) //調(diào)用call方法,繼承sup超類屬性
this.age = age
}

sub.prototype = new sup //把子類sub的原型對(duì)象指向父類的實(shí)例化對(duì)象,這樣即可以繼承父類sup原型對(duì)象上的屬性和方法
sub.prototype.constructor = sub //這時(shí)會(huì)有個(gè)問題子類的constructor屬性會(huì)指向sup,手動(dòng)把constructor屬性指向子類sub
//這時(shí)就可以在父類的基礎(chǔ)上添加屬性和方法了
sub.prototype.printAge = function (){
console.log(this.age)
}
這時(shí)調(diào)用父類生成一個(gè)實(shí)例化對(duì)象:

let jack = new sub('jack',20)
jack.printName()    //輸出 : jack
jack.printAge()    //輸出 : 20

這就是es5中實(shí)現(xiàn)繼承的方法。
而在es6中實(shí)現(xiàn)繼承:

class sup {
    constructor(name) {
        this.name = name
    }

    printName() {
        console.log(this.name)
    }
}

class sub extends sup{
constructor(name,age) {
super(name)
this.age = age
}

printAge() {
    console.log(this.age)
}

}

let jack = new sub('jack',20)
jack.printName() //輸出 : jack
jack.printAge() //輸出 : 20
對(duì)比es5和es6可以發(fā)現(xiàn)在es5實(shí)現(xiàn)繼承,在es5中實(shí)現(xiàn)繼承:

首先得先調(diào)用函數(shù)的call方法把父類的屬性給繼承過來
通過new關(guān)鍵字繼承父類原型的對(duì)象上的方法和屬性
最后再通過手動(dòng)指定constructor屬性指向子類對(duì)象
而在es6中實(shí)現(xiàn)繼承,直接調(diào)用super(name),就可以直接繼承父類的屬性和方法,所以super作用就相當(dāng)于上述的實(shí)現(xiàn)繼承的步驟,不過es6提供了super語法糖,簡單化了繼承的實(shí)現(xiàn)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 首先,“語法糖”的意思是現(xiàn)有技術(shù)本可以實(shí)現(xiàn),但是采用某種寫法會(huì)更加簡潔優(yōu)雅。最常見的就是聲明對(duì)象采用的就是語法糖 ...
    HarryPang閱讀 349評(píng)論 0 0
  • 繼承6種套餐 參照紅皮書,JS繼承一共6種 1.原型鏈繼承 核心思想:子類的原型指向父類的一個(gè)實(shí)例 Son.pro...
    燈不梨喵閱讀 3,252評(píng)論 1 2
  • class的基本用法 概述 JavaScript語言的傳統(tǒng)方法是通過構(gòu)造函數(shù),定義并生成新對(duì)象。下面是一個(gè)例子: ...
    呼呼哥閱讀 4,200評(píng)論 3 11
  • 繼承是面向?qū)ο笾幸粋€(gè)比較核心的概念。其他正統(tǒng)面向?qū)ο笳Z言都會(huì)用兩種方式實(shí)現(xiàn)繼承:一個(gè)是接口實(shí)現(xiàn),一個(gè)是繼承。而EC...
    dxxwdong閱讀 411評(píng)論 0 2
  • 淡云疏月閱讀 192評(píng)論 0 0

友情鏈接更多精彩內(nèi)容