啥是类的继承

如果两个类Animal和Dog,如果可以描述为:**DogAnimal,则,AnimalDog**形成继承关系
如果**DogAnimal**,则可以叫做:
1.** Dog继承自**Animal
2.** Animal派生**Dog
3.** DogAnimal的子类
4. AnimalDog**的父类
如果**AnimalDog的父类,则Dog会自动拥有Animal**中的所有实例成员。

如何实现的类的继承

es5实现继承前
让Dog 继承与 Animal

  1. function Animal(type, name, age, sex) {
  2. this.type = type;
  3. this.name = name;
  4. this.age = age;
  5. this.sex = sex;
  6. }
  7. Animal.prototype.print = function () {
  8. console.log(`【种类】:${this.type}`);
  9. console.log(`【名字】:${this.name}`);
  10. console.log(`【年龄】:${this.age}`);
  11. console.log(`【性别】:${this.sex}`);
  12. }
  13. function Dog(name, age, sex) {
  14. }
  15. const dog = new Dog('旺财',3,'公')
  16. console.log(dog)

他们的原型链如图
image.png
想要实现Dog继承Animal那吗Dog的prototype的proto就得指向animal的prototype如下图
image.png
代码如下

  1. function Animal(type, name, age, sex) {
  2. this.type = type;
  3. this.name = name;
  4. this.age = age;
  5. this.sex = sex;
  6. }
  7. Animal.prototype.print = function () {
  8. console.log(`【种类】:${this.type}`);
  9. console.log(`【名字】:${this.name}`);
  10. console.log(`【年龄】:${this.age}`);
  11. console.log(`【性别】:${this.sex}`);
  12. }
  13. function Dog(name, age, sex) {
  14. //借用父类的构造函数
  15. Animal.call(this, "犬类", name, age, sex);
  16. }
  17. // 将Dog的_proto指向Animal的prototype
  18. Object.setPrototypeOf(Dog.prototype, Animal.prototype);
  19. const d = new Dog("旺财", 3, "公");
  20. d.print();
  21. console.log(d);

但这是es5中的写法
在其es6中的写法为
关键字
extends :**继承,用于类的定义
super:
直接当函数调用,表示父类构造函数
如果当做对象使用,则表示父类的原型
es6要求如果定义了constructor,并且该类是子类,则必须在constructor的第一行手动调用父类的构造函数
如果子类不写co**nstructor,则会有默认的构造器,该构造器需要的参数和父类一致,并且自动调用父类构造器

  1. class Animal {
  2. constructor(type, name, age, sex) {
  3. this.type = type;
  4. this.name = name;
  5. this.age = age;
  6. this.sex = sex;
  7. }
  8. print() {
  9. console.log(`【种类】:${this.type}`);
  10. console.log(`【名字】:${this.name}`);
  11. console.log(`【年龄】:${this.age}`);
  12. console.log(`【性别】:${this.sex}`);
  13. }
  14. jiao(){
  15. throw new Error("动物怎么叫的?");
  16. }
  17. }
  18. // 使用extends 关键字 让其Dog 继承与Animal
  19. class Dog extends Animal {
  20. constructor(name, age, sex) {
  21. //此处当做函数调用,但是supper()必须写在constructor里的第一行,让先调用一次才能实现类的继承。否则无法
  22. super("犬类", name, age, sex);
  23. // 子类特有的属性
  24. this.loves = "吃骨头";
  25. }
  26. print(){
  27. //调用父类的print
  28. //此处supper被当做对象调用,此处supper就表示父类的prototype
  29. super.print();
  30. //自己特有的代码
  31. console.log(`【爱好】:${this.loves}`);
  32. }
  33. //同名方法,会覆盖父类
  34. jiao(){
  35. console.log("旺旺!");
  36. }
  37. }
  38. const d = new Dog("旺财", 3, "公");
  39. d.print();
  40. console.log(d)
  41. d.jiao();