//子类继承父类 能够继承什么呢?
class Person{
constructor(name){
this.name = name; //实例属性
this.run = function(){ //实例方法
console.log('run');
}
}
speak(){ //实例方法
console.log('speak');
}
static speak(){ //类的方法
console.log('static speak')
}
}
Person.version = '1.0'; //类的属性
class Programmer extends Person{
constructor(name){
super(name) //一定要调用父类的构造方法
}
}
const zs = new Programmer('zs');
console.log(zs.name); // zs
zs.run(); //run
zs.speak(); //speak
Programmer.speak(); //static speak
console.log(Programmer.version); //'1.0'
2.改写继承的属性或方法
同名覆盖
class Programmer extends Person{
constructor(name){
super(name) //一定要调用父类的构造方法,且js规定了this操作不能放在super前面
}
//同名覆盖
speak(){
console.log(`Programmer speak`);
}
static speak(){ //类的方法
console.log('static Programmer speak')
}
}
Programmer.version = '2.0';
3.super
3.1可以作为函数调用
此时代表父类的构造方法constructor,只能在子类的构造方法中,用在其他的地方就会报错
//super虽然代表了父类的构造方法,但是内部的this指向子类的实例
class Person{
constructor(name){
this.name = name;
console.log(this);
}
}
class Programmer extends Person{
constructor(name){
super(name)
}
}
const zs = new Programmer('zs'); //输出的super函数中的this指向Programmer实例对象
3.2也可以作为对象使用
//1.在构造方法中使用或一般方法中使用
//super代表父类的原型对象Person.prototype
//所以定义在父类实例上的方法或属性,是无法通过super调用的
//通过super调用父类的方法时,方法内部的this指向当前的子类实例
class Person{
constructor(name){
this.name = name;
}
speak(){
console.log('speak');
console.log(this);
}
}
class Programmer extends Person{
constructor(name){
super(name)
super.speak() //speak this指向子类Programmer实例对象
console.log(super.name) //undefined 因为name属性不在原型对象prototype上,而是在实例上
}
}
const zs = new Programmer('zs');
//===========================================================================
//super在静态方法中使用
class Person{
constructor(name){
this.name = name;
}
speak(){
console.log('speak');
console.log(this);
}
static speak(){
console.log('Person static speak');
console.log(this);
}
}
class Programmer extends Person{
constructor(name){
super(name)
}
static speak(){
//在静态方法中使用
//super指向父类,而不是父类的原型对象 否则就变成实例的speak()了
//通过super调用父类的方法时,方法内部的this指向当前的子类,而不是子类实例或者父类
super.speak();
console.log('Programer static speak');
}
}
Programmer.speak(); //Person static speak
//this指向子类
//Programer static speak
3.3 super的注意事项
使用super的时候,必须显式指定是作为函数还是作为对象使用,否则会报错