美文网首页JavaScript基础
ES6 Class 中的 super 关键字

ES6 Class 中的 super 关键字

作者: 是嘤嘤嘤呀 | 来源:发表于2019-07-24 16:56 被阅读0次

super这个关键字,既可以当作函数使用,也可以当作对象使用。在这两种情况下,它的用法完全不同。

1、当作函数使用

class Sup {}
class Sub extends Sup {
    constructor() {
        super(); //ES6 要求,子类的构造函数必须执行一次super函数。
    }
}

\color{red}{注:}super()在这里相当于 A.prototype.constructor.call(this)super虽然代表了父类Sup的构造函数,但是返回的是子类Sub的实例,即super内部的this指的是Sub

class Sup {
    constructor() {
        console.log(new.target.name); //new.target指向当前正在执行的函数
    }
}
class Sub extends Sup {
    constructor() {
        super();
    }
}
new Sup() // A
new Sub() // B

可以看到,在super()执行时,它指向的是子类Sub的构造函数,而不是父类Sup的构造函数。也就是说,super()内部的this指向的是Sub

2、当作对象使用

在普通方法中,指向父类的原型对象;在静态方法中,指向父类。

class Sup {
   c() {
       return 2;
   }
}
class Sub extends Sup {
    constructor() {
        super();
        console.log(super.c()); // 2
     }
}
let b = new Sub();

上面代码中,子类Sub当中的super.c(),就是将super当作一个对象使用。这时,super在普通方法之中,指向Sup.prototype,所以super.c()就相当于Sup.prototype.c()。通过super调用父类的方法时,super会绑定子类的this

class Sup {
    constructor() {
         this.x = 1;
     }
     s() {
         console.log(this.x);
     }
}
class Sub extends Sup {
    constructor() {
        super();
        this.x = 2;
    }
    m() {
        super.s();
    }
}
let b = new Sub();
b.m() // 2

上面代码中,super.s()虽然调用的是Sup.prototype.s(),但是Sup.prototype.s()会绑定子类Subthis,导致输出的是2,而不是1。也就是说,实际上执行的是super.s.call(this)
由于绑定子类的this,所以如果通过super对某个属性赋值,这时super就是this,赋值的属性会变成子类实例的属性。

class Sup {
    constructor() {
        this.x = 1;
    }
}
class Sub extends Sup {
    constructor() {
        super();
        this.x = 2;
        super.x = 3;
        console.log(super.x); // undefined
        console.log(this.x); // 3
    }
}
let b = new Sub();

上面代码中,super.x赋值为3,这时等同于对this.x赋值为3。而当读取super.x的时候,读的是Sup.prototype.x,所以返回undefined
\color{red}{注:}使用super的时候,必须显式指定是作为函数、还是作为对象使用,否则会报错。

相关文章

  • 组件编写

    super关键字 使用class关键字时无法使用super.method,解决方案

  • react从0到1的探索记录02

    9、在react中如何创建组件 ES6中class关键字的作用 class关键字中构造器constructor的了...

  • iOS-浅谈OC中的Super关键字

    目录 super关键字----问题思考----super的结构----objc_super结构体----class...

  • ES6 Class 中的 super 关键字

    super这个关键字,既可以当作函数使用,也可以当作对象使用。在这两种情况下,它的用法完全不同。 1、当作函数使用...

  • 13.ES6面向对象之继承

    ES6中面向对象可以继承:1、ES6中的继承使用关键字 extends2、调用父类构造使用super() 案例

  • 26- class 类与继承

    1、ES5 中基于原型的构造函数 2、ES6 的 class关键字 ES6 引入了 Class(类)这个概念,作为...

  • 一张图看懂class类中的super关键字

    es6新增了class类,其中的super关键字不是很好理解,在类继承的时候,它必不可少。利用闲暇时间,整理了下图...

  • ES6标准入门 摘要 (Class的继承)

    简介 Class 可以通过extends关键字实现继承。 子类必须在constructor方法中调用super方法...

  • ES6学习

    最常用的ES6特性let, const, class, extends, super, arrow functio...

  • 无标题文章

    最常用的ES6特性 let, const, class, extends, super, arrow functi...

网友评论

    本文标题:ES6 Class 中的 super 关键字

    本文链接:https://www.haomeiwen.com/subject/flyxrctx.html