super是es6新出的關鍵字,它既可以當作函數使用,也可以當作對象使用,兩種使用方法不盡相同
1.super用作函數使用的時候,代表父類的構造函數,es6規定在子類中使用this之前必須先執行一次super函數,super相當於Father.prototype.constructor.call(this)
class Father{ constructor(){ this.a = 1; } } class Son extends Father{ constructor(){ super(); } }
2.super用作對象的時候,在普通方法中指向父類的原型對象,在靜態方法中指向父類
子類中使用super無法訪問Father的實例屬性a,可以訪問原型對象上的p
class Father { constructor() { this.a = 1; } p() {
console.log(thia.a); console.log('hello'); } } class Son extends Father { constructor() { super();
this.a = 2; super.p();//'2 hello' Father.prototype.p()方法內部的this指向的是子類實例 super.a;//undefined } }
- 靜態方法中指向的是父類,而非父類的構造函數
- static method中super指向父類Parent,相當於訪問Parent.myMethod
- 普通 method中super指向父類Parent的prototype,相當於訪問Parent.prototype.myMethod
class Parent { static myMethod(msg) { console.log('static', msg); } myMethod(msg) { console.log('instance', msg); } } class Child extends Parent { static myMethod(msg) { super.myMethod(msg); //super指向父類因此訪問的是static myMethod } myMethod(msg) { super.myMethod(msg); //super指向的是父類的構造函數,訪問的是Parent.prototype.myMethod } } Child.myMethod(222);//static 222 let child = new Child; child.myMethod(111);//instance 111