ES6 super

    技术2022-07-12  89

    super存在于类的函数中,constructor、普通方法、静态方法,分别代表不同值。

    super大三用处

    (1)在constructor中

    super()执行,相等于父类constructor方法执行。得到constructor内外this上的属性。

    super赋值,super.prop = 1  super赋值操作,此时super指代this;给this对象添加或修改属性值。

    super取值,super.prop,super指代父类原型。读取父类原型上的属性或方法。

    取值取原型、赋值赋给自己;

    (2)在静态方法中

    super指代父类,因为可以通过super调用父类的静态方法和属性

    (3)在普通方法中

    super指代父类原型,因此可以通过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的实例

    子类中constructor,在使用this前,必须先执行一下super()方法,执行父类的constructor函数,之后子类的constructor才能使用this。。

    当使用 Object.defineProperty 定义一个属性为不可写时,super也不能修改这个属性的值。

    Processed: 0.009, SQL: 9