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调用哦父类原型的方法和属性

你可能感兴趣的:(JavaScript)