super与实例没有什么关系,它本身有两个作用的,参考如下理解:
1.super可以当函数用。super作为函数调用时,表示父类的构造函数。示例:
class Par { constructor() { this.num = 21; } } class Chil extends Par { constructor() { //继承父类的构造函数constructor super() } } var p = new Chil(); // 子类的实例上,可以调用num属性,则说明子类的构造函数中 // 通过 super() 继承了父类的构造函数。 console.log(p.num) //21
super() 表示的父类的构造器,那么super() 中的参数,自然表示父类构造器中的参数。
class Par { // 为了区分父类与子类的参数,这里起名为username1 constructor(username1) { //username1接收username的值 this.username = username1; //所以this.username="小慕" } } class Chil extends Par { constructor(username) { //username接收的就是下面实例化的参数"小慕" super(username)//super表示父类的构造器,所以这里是把username传递给父类构造器 } } var p = new Chil("小慕"); //实例化的时候,传入参数"小慕" // 实例化对象,会继承类的属性和方法,Chil类继承了父类的属性username,所以Chil类的实例化对象 //也就可以调用到username,输出"小慕" console.log(p.username) //小慕
2.可以作为对象使用。super 作为对象使用时, 在普通的方法中,指向的是父类的原型对象。在静态方法中,指向的是父类。
也就是作为对象去使用分了两种情况,扩展一下,作为了解:
class A { constructor() { } // 普通方法,放在A原型上的。 say() { console.log("普通方法") } // 加static定义的叫做静态方法,能被子类继承,但是不能被实例化对象继承。 static greeting() { console.log("静态方法") } } class B extends A { constructor() { super(); //在构造器中,作为函数调用,是继承父类构造器 } bsay() { // 在普通方法中,super指向的是父类原型对象,即prototype, // 所以能访问父类原型上的方法。 super.say() // "普通方法"; } static bgreeting() { // 在静态方法中,super指向的是父类,能访问父类的静态属性和静态方法。 super.greeting(); //"静态方法" } } let xiao = new B(); xiao.bsay(); B.bgreeting();