1.classsegmentfault
class 熟悉的關鍵字 我大學的主修語言是C#,class 做爲後端語言定義類的關鍵字,引入ES6做爲語法糖,引入了後端的思想在咱們能夠定義類,更直觀的實現類的繼承。在建立實例對象的時候除了實例化構造函數,還能夠實例化定義好的類。constructor :其中 constructor 方法是類的構造函數,是一個默認方法,經過 new 命令建立對象實例時,
自動調用該方法。它還有幾個特性這裏來一個一個舉例分析。後端
第一個:一個類必須有 constructor 方法,若是沒有顯式定義,一個默認的 consructor 方法會被默認添加。因此即便你沒有添加構造函數,也是會有一個默認的構造函數的。函數
class Parent1{ a=1; } class Parent2{ constructor(){ this.a=1; }; } console.log(new Parent1())//{a: 1} console.log(new Parent2())//{a: 1}
也就是說即便你不添加 constructor 構造函數,它默認也會添加一個而且返回當前類的上下文。
第二個:通常 constructor 方法返回當前構造的實例對象 this ,可是也能夠指定 constructor 方法返回一個全新的對象,讓返回的實例對象不是該類構造的實例對象。this
class Parent1{ constructor(){ this.a=1; }; } class Parent2{ constructor(a){ return a; }; } console.log(new Parent1())//{a: 1}
也就是說 constructor 默認會返回實例對象的this,可是當你爲它手動添加返回值時,就改變了它的返回對象。最後總結:也就是實例化類的時候,constructor做爲一個構造器 幫忙把當前類的屬性實例化返回一個實例對象。
2.extends super
extends繼承,是指在聲明一個子類時用extends指定想要繼承的父類。這從原理上實際上是從父類的原型繼承而來。仍是拆分解讀繼承的特性舉例說明:
(1)在子類 constructor 中必須調用 super 方法,由於子類沒有本身的 this 對象,而是繼承父類的 this 對象。prototype
class Parent{ constructor(){ this.name="parent"; }; getName(){ console.log(this.name) } } class Child extends Parent { constructor(name){ // this.name=name; super(); this.name=name; }; } let child = new Child("child")//當this.name 在super前執行時 報錯 Must call super constructor in derived class before accessing 'this let child = new Child("child")//當this.name 在super後執行時 child.getName();// child
解釋:由於子類在繼承時沒有一個建立上下文的過程,super 就表明了父類的構造函數 也就是Parent 的 constructor ,執行父類的構造函數實例化的對象做爲子類的實例。也就是是約等於下邊這種實現。code
class Parent{ constructor(){ this.name="parent"; }; getName(){ console.log(this.name) } } class Child { constructor(name){ new Parent(); this.name=name; }; }
在這裏須要注意super()在constructor中執行時內部的 this 指的是 B,所以 super() 在這裏至關於 ```A.prototype.constructor.call(this, props)``。
(2)子類中的屬性如過和父屬性重複,在讀取時優先讀取子類裏的屬性。對象
class Parent{ constructor(){ this.name="parent"; }; getName(){ console.log(this.name) } } class Child extends Parent { constructor(){ super(); }; getName(){ console.log("child") } } let child = new Child(); child.getName();// child
那若是想要調用繼承來的方法,可是還要添加進子類的操做呢。繼承
class Child extends Parent { constructor(){ super(); }; getName(){ this.name=" from child"; super.getName(); } } let child = new Child(); child.getName();// from child
最後附上文章參考的傳送門get