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();
【结果】
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();
【结果】
3.类的冷知识
(1)用JS制作抽象类,抽象类一般是父类,不能通过该类直接创建对象(抽象的概念,比如人,动物,没办法直接创建人这个对象,因为它是一个抽象出来的概念)
(2)正常情况下,this始终指向具体的类的对象