JavaScript入門 練習問題 25:構文:クラスの継承(extendsとsuperの利用)
次のクラス継承に関するコードを実行したときのコンソールへの出力として正しいものはどれですか?
```javascript
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(this.name + 'は音を出します');
}
}
class Dog extends Animal {
speak() {
super.speak();
console.log(this.name + 'は吠えます');
}
}
const dog = new Dog('ポチ');
dog.speak();
```
- 1行目: ポチは音を出します、2行目: ポチは吠えます
- 1行目: ポチは吠えます、2行目: ポチは音を出します
- 1行目: ポチは音を出します、2行目は出力されない
- 1行目: ポチは吠えます、2行目は出力されない
- superの呼び出しでエラーが発生し何も出力されない
Qraftユーザーの成績:難易度 Dランク(レーティング1113)・正答率 75%(9/12回正解)
レーティングは解いた人の実力と正誤から算出する難しさ(初期値1200)。ランクはその全問題中の順位(S+が最難関、F-が最易)
正解と解説を見る
DogクラスのspeakメソッドはまずsuperキーワードでAnimalクラスのspeakメソッドを呼び出し、その後に自身の処理を実行します。そのためAnimalのspeak内の出力が先に、Dog独自の出力が後に表示されます。
【正解の理由】
dog.speak()を呼ぶとDogクラスのspeakが実行され、内部の「super.speak()」でAnimalクラスのspeakメソッドが先に呼び出され「ポチは音を出します」が出力されます。その後、続く行の「ポチは吠えます」が出力されるため、この順序が正しくなります。
【不正解の理由】
• 「1行目: ポチは吠えます、2行目: ポチは音を出します」:super.speak()の呼び出しはDog独自の処理より先に書かれているため、出力順が逆になっている
• 「1行目: ポチは音を出します、2行目は出力されない」:super.speak()呼び出し後もDogのspeak内の処理は継続して実行される
• 「1行目: ポチは吠えます、2行目は出力されない」:super.speak()の呼び出しが省略されるという誤った理解に基づいている
• 「superの呼び出しでエラーが発生し何も出力されない」:親クラスのメソッドをsuperで呼び出すこと自体は正常な構文であり、エラーにはならない