ES6 class super

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

相關文章
相關標籤/搜索