無.Flac's Blog

無.Flac

JavaScript之继承?

15
2024-12-18

什么是继承?

继承是面向对象编程中的一个概念,它允许我们创建一个基于另一个类的新类。新类(子类)继承了父类的属性和方法,并且可以添加或修改这些属性和方法。

什么是 super

super 是一个关键字,用于访问和调用父类的函数。在子类的构造函数中,super() 调用父类的构造函数。在子类的方法中,super.methodName() 调用父类的 methodName 方法。

为什么要用 super

  • 初始化父类的属性:父类的构造函数通常用于初始化父类的属性。如果子类没有调用父类的构造函数,父类的属性就不会被初始化,可能会导致错误。

  • 使用父类的方法:子类可以调用父类的方法,并在此基础上添加新的行为。


例子

假设我们有一个 Animal 类,它有一个构造函数来设置动物的名字:

class Animal {
  constructor(name) {
    this.name = name;
  }
}

现在,我们想要创建一个 Dog 类,它继承自 Animal

class Dog extends Animal {
  constructor(name, breed) {
    super(name); // 调用父类的构造函数,设置名字
    this.breed = breed; // 设置狗的品种
  }
}

在这个例子中,Dog 类的构造函数接受两个参数:namebreed。我们使用 super(name) 来调用 Animal 类的构造函数,这样我们就可以设置 Dogname 属性。然后,我们设置 Dog 特有的属性 breed

如果我们不使用 super(name),那么 Dogname 属性就不会被设置,因为 Animal 类的构造函数没有被调用。

为什么不能直接这样写?

class Cat extends Animal {
  constructor() {
    this.age = age;
  }
}

在这个例子中,你尝试直接在 Cat 的构造函数中给 this.age 赋值,但是没有调用 super()。这样做会导致错误,因为:

  1. JavaScript 要求在访问 this 之前必须调用 super()

  2. 没有调用 Animal 类的构造函数,所以 Animal 类中定义的属性(如 name)不会被初始化。

总结

super 关键字是 JavaScript 中实现继承的重要工具。它确保父类的构造函数被正确地调用,以便初始化继承的属性,并且它允许子类调用父类的方法。