ES6 super

我理解的super:重點看例子中備註

(1)constructor構造函數內容的兩種寫法

(2)constructor內的this指代調用者,類調用,指向該類的實例,子類調用,指向子類的實例

(3)父類的所有內容都被繼承到子類對應的位置。父類中普通方法和屬性,在父類的原型上,被子類原型繼承。父類中的靜態方法和靜態屬性,在父類上,被子類繼承。

(4)子類中constructor,在使用this前,必須先執行一下super()方法,執行父類的constructor函數,之後子類的constructor才能使用this。

(5)子類的constructor中,通過super[prop]賦值時,super代表this。通過super[prop]取值時,super代表父類原型。

(6)靜態方法和屬性可以與普通方法和屬性重名,因爲靜態方法和屬性在類上,而普通方法和屬性在類的原型上。互不影響。

(7)靜態方法只能由類調用,普通方法只有由實例和原型調用。

(8)實例的constructor屬性(bar.constructor)代表的是類Bar。因此可以在類外面調用類的靜態方法和屬性。

(9)當使用 Object.defineProperty 定義一個屬性爲不可寫時,super也不能修改這個屬性的值。

        class Foo {
            d = 4;          //寫在這裏相當於constructor中的this.d;
            constructor() {
                this.a = 1;
                console.log(this);//子類繼承父類時,constructor中的this指代子類實例。創建父類實例時,this指代父類實例。
            }
            static staticFuncA() {//靜態方法,只有由類調用
                console.log("father static function")
            }
            funcA() {//普通方法,只能由類的原型調用
                console.log("a");
            }
            get propFoo(){
                return "父類原型上的屬性";
            }
        }

        class Bar extends Foo {
            constructor() {
                super();
                this.b = 2;
                this.c = 3;
                super.d = 10;// 設置在this上設置
                console.log(super.propFoo,this.d);//取值在父類上取值  undefined 10
                Bar.staticFuncB();//靜態方法只能由類調用
                Bar.prototype.funcB();//普通方法,在原型上,只有由原型調用
            }
            funcB() {
                console.log(super.funcA);//普通方法中調用super,super代表父類原型Bar.prototype,原型上有類的普通方法和普通屬性 
            }
            static staticFuncB(){//靜態方法可以和普通方法重名,不影響
                console.log(super.staticFuncA); //靜態方法中調用super,super代表父類Bar,父類上有類的靜態方法和靜態屬性
            }
        }
        Foo.prop = "static prop";//創建一個靜態屬性,靜態屬性同樣只有由類調用
        Bar.staticprop = "static propBar";
        var bar = new Bar();
        console.log(bar.constructor.staticprop, bar.constructor.prop);//static propBar static prop,bar.constructor是Bar類
        bar.funcB();//bar是Bar的實例

總結:super大三用處

(1)在constructor中

super()代表執行父類的constructor,此時父類的constructor中的this指代子類實例

super.prop = 1  super賦值操作,此時super指代this

super.prop     super取值,super指代父類原型

(2)在靜態方法中

super指代父類,因爲可以通過super調用父類的靜態方法和屬性

(3)在普通方法中

super指代父類原型,因此可以通過super調用哦父類原型的方法和屬性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章