欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ES6对象(3):类的继承

程序员文章站 2022-03-20 12:05:37
...

1.继承的概念

如果两个类A和B,如果可以描述为:B是A(例如:猫是动物,轿车是汽车,男人是人),则A和B形成继承关系。如果B是A,则:

  • B继承自A
  • A派生B
  • B是A的子类
  • A是B的父类

如果A是B的父类,则B会自动拥有A中的所有实例成员

【例1】ES6之前的继承

function Animal(type, name, age, sex) {
    this.type = type;
    this.name = name;
    this.age = age;
    this.sex = sex;
}
Animal.prototype.print = function () {
    console.log(this);
}
function Dog(name, age, sex) {
    Animal.call(this, '犬类', name, age, sex)
}
Object.setPrototypeOf(Dog.prototype, Animal.prototype)
const dog = new Dog('旺财', 3, '公')
dog.print();

【结果】

ES6对象(3):类的继承
图1

 

2.新的关键字

(1)extend:继承,用于类的定义

(2)super

  • 直接当函数调用,表示父类构造函数
  • 如果当对象使用,则表示父类的原型

【注】ES6要求,如果定义了constructor,并且该类是子类,则必须在constructor的第一行手动调用父类的构造函数;如果子类不写constructor,则会有默认的构造器,该构造器需要的参数与父类一致,并且自动调用父类构造器

【例2】

class Animal {
    constructor(type, name, age, sex) {
        this.type = type;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    print() {
        console.log(`种类:${this.type}`);
        console.log(`名字:${this.name}`);
        console.log(`年龄:${this.age}`);
        console.log(`性别:${this.sex}`);
    }
    shout() {
        throw new Error('动物怎么叫的?');
    }
}
class Dog extends Animal {
    constructor(name, age, sex) {
        super('犬类', name, age, sex);
        //子类特有的属性
        this.love = '吃骨头';
    }
    print() {
        //调用父类的print
        super.print();
        //自己特有的代码
        console.log(`爱好:${this.love}`);
    }
    //同名方法会覆盖父类
    shout(){
        console.log('wangwang')
    }
}
const d = new Dog('旺财', 3, '公')
d.print();
console.log(d);
d.shout();

【结果】

ES6对象(3):类的继承
图2

 

3.类的冷知识

(1)用JS制作抽象类,抽象类一般是父类,不能通过该类直接创建对象(抽象的概念,比如人,动物,没办法直接创建人这个对象,因为它是一个抽象出来的概念)

(2)正常情况下,this始终指向具体的类的对象