1、基本语法
- ES6中的继承直接通过
extends
关键字来实现继承; - 子类的constructor中必须显示调用super()方法。
class A {}
class B extends A {
constructor () {
super();
}
}
在子类的constructor中调用了super()方法之后,才会生成子类的this对象。
因此,this对象的使用只能放在super()方法之后调用。
2、使用Object.getPrototypeOf()获取子类的父类
Object.getPrototypeOf(B) === A // true
3、super关键字的使用
super关键字有两种使用方法:
-
作为super方法来调用,生成子类实例并实现继承;代表父类的构造函数;
注意,super虽然代表了父类A的构造函数,但是返回的是子类B的实例;
即super内部的this指的是B的实例;
作为 #函数# 时,super()只能用在子类的构造函数之中,用在其他地方(比如实例方法)就会报错。
image.png
-
作为super对象来使用, 代表父类对象
super作为对象在普通方法或者constructor中使用时,指向父类的原型对象;
因此在普通方法或者constructor中,是无法通过super对象来调用父类实例上的属性和方法的
image.png

super作为对象在静态方法中使用时,指向父类;

在子类的静态方法中通过super调用父类的方法时,方法内部的this指向当前的子类,而不是子类的实例

由于对象总是继承其他对象的,所以可以在任意一个对象中,使用super关键字

4、类的 prototype 属性和proto属性
记住两条规则即可:
- 子类的proto属性,表示构造函数的继承,指向父类(因为class语法表示的是构造函数,而函数自带prototype属性)
B.__proto__ === A
- 子类的prototype的proto属性,表示方法的继承,指向父类的prototype(因为class内部的方法都是定义在原型上的)
B.prototype.__proto__ === A.prototype
网友评论