什么是继承? {#%E4%BB%80%E4%B9%88%E6%98%AF%E7%BB%A7%E6%89%BF%EF%BC%9F}
继承是面向对象编程中的一个概念,它允许我们创建一个基于另一个类的新类。新类(子类)继承了父类的属性和方法,并且可以添加或修改这些属性和方法。
什么是 super
? {#%E4%BB%80%E4%B9%88%E6%98%AF-super%EF%BC%9F}
super
是一个关键字,用于访问和调用父类的函数。在子类的构造函数中,super()
调用父类的构造函数。在子类的方法中,super.methodName()
调用父类的 methodName
方法。
为什么要用 super
? {#%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E7%94%A8-super%EF%BC%9F}
-
初始化父类的属性:父类的构造函数通常用于初始化父类的属性。如果子类没有调用父类的构造函数,父类的属性就不会被初始化,可能会导致错误。
-
使用父类的方法:子类可以调用父类的方法,并在此基础上添加新的行为。
例子 {#%E4%BE%8B%E5%AD%90}
假设我们有一个 Animal
类,它有一个构造函数来设置动物的名字:
class Animal {
constructor(name) {
this.name = name;
}
}
现在,我们想要创建一个 Dog
类,它继承自 Animal
:
class Dog extends Animal {
constructor(name, breed) {
super(name); // 调用父类的构造函数,设置名字
this.breed = breed; // 设置狗的品种
}
}
在这个例子中,Dog
类的构造函数接受两个参数:name
和 breed
。我们使用 super(name)
来调用 Animal
类的构造函数,这样我们就可以设置 Dog
的 name
属性。然后,我们设置 Dog
特有的属性 breed
。
如果我们不使用 super(name)
,那么 Dog
的 name
属性就不会被设置,因为 Animal
类的构造函数没有被调用。
为什么不能直接这样写? {#%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%8D%E8%83%BD%E7%9B%B4%E6%8E%A5%E8%BF%99%E6%A0%B7%E5%86%99%EF%BC%9F}
class Cat extends Animal {
constructor() {
this.age = age;
}
}
在这个例子中,你尝试直接在 Cat
的构造函数中给 this.age
赋值,但是没有调用 super()
。这样做会导致错误,因为:
-
JavaScript 要求在访问
this
之前必须调用super()
。 -
没有调用
Animal
类的构造函数,所以Animal
类中定义的属性(如name
)不会被初始化。
总结 {#%E6%80%BB%E7%BB%93}
super
关键字是 JavaScript 中实现继承的重要工具。它确保父类的构造函数被正确地调用,以便初始化继承的属性,并且它允许子类调用父类的方法。