【发布时间】:2021-09-30 22:00:52
【问题描述】:
我从 MDN 中找到了一个关于 super 的示例。我了解到超级函数调用父类的构造函数,以便子类可以继承它的所有属性/方法。但是,在 MDn 的示例中,它调用了子类的构造函数。
<script>
class Rectangle {
constructor(height, width) {
this.name = 'Rectangle';
this.height = height;
this.width = width;
}
}
class Square extends Rectangle {
constructor(length) {
super(length, length);
this.name = 'Square';
}
}
let a = new Square(4);
console.log(JSON.stringify(a));
console.log(a.height);
</script>
所以我们有一个从 Rectangle 扩展而来的 Square 构造函数。我的困惑在于超级函数有两个来自 Square 的参数,但 Square 是 Rectangle 的子类。在 Square 中调用 super 并将 Rectangle 的高度和宽度传递给它,这样 Square 可以从 Rectangle 继承高度和宽度,因为 Square 正在扩展 Rectangle 是否有意义?
【问题讨论】:
-
@jarmod,很抱歉造成混乱。我已经编辑了我的问题,并愿意在这里以任何方式使我的问题更清楚,以便您理解。
-
您不必调用构造函数来继承方法。只需要执行父类的初始化。
-
Square 是派生自 Rectangle 的类。 Square 构造函数使用 Rectangle 的宽度和高度的长度调用父 Rectangle 类构造函数(因为 Square 是宽度等于其高度的 Rectangle)。 Square 构造函数需要在访问“this”(设置正方形名称时)或从派生构造函数返回之前调用 Rectangle(超级)构造函数,否则将引发 ReferenceError。方形比矩形更具体。 Rectangle 对 Square 一无所知。
-
@jarmod,很好的答案。如果您能解释更多,并将其作为答案发布,我会接受。
标签: javascript class