extends:使用该关键字就可以继承任何拥有([Construct])和原型的对象
//继承类
class Vehicle{}
class Bus extends vehicle{}
let b = new Bus();
console.log(b instanceof Bus);//true
console.log(b instanceof Vehicle);//true
//继承普通构造函数
function Person(){}
class Engineer extends Person{}
let e = new Engineer();
console.log(e instanceof Engineer);//true
console.log(e instanceof Person);//true
super:派生类通过super关键字引用原型,使用时需要注意以下几点
- 只能在派生类构造函数和静态方法中使用
class Vehicle{
constructor(){
super();//SyntaxError: 'super' keyword unexpected
}
}
- 不能单独引用关键字,要么用它调用构造函数,要么引用静态方法
class Vehicle{}
class Bus extends Vehicle{
constructor(){
console.log(super);//SyntaxError: 'super' keyword unexpected here
}
}
- 调用super()会调用父类构造函数,并将实例赋值给this
class Vehicle{}
class Bus extends Vehicle{
constructor(){
super();
console.log(this instanceof Vehicle);
}
}
new Bus();//true
- 在类构造函数中,不能在调用super()之前引用this
class Vehicle{}
class Bus extends Vehicle{
constructor(){
console.log(this);
}
}
new Bus();//ReferenceError:Must call super constructor in derived class
// before accessing 'this' or returning from derived constructor
- 如果派生类中显式定义了构造函数,则要么必须在其中调用super(),要么在其中返回一个对象
class Vehicle{}
class Car extends Vehicle{}
class Bus extends Vehicle{
constructor(){
super();
}
}
class Van extends Vehicle{
constructor(){
return {};
}
}
console.log(new Car());//Car{}
console.log(new Bus());//Bus{}
console.log(new Van());//{}