首先,“語法糖”的意思是現(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)