1. 通常と注目が混ざる
  2. 空の配列
  3. すべて通常の作品
  4. badge が空文字なら通常の作品として扱う
コース一覧
モダンJavaScript:データ処理とコード設計
継承と super

モダンJavaScript:データ処理とコード設計

配列の map・filter・reduce・sort、クロージャと高階関数、オブジェクトとクラス、エラー設計、正規表現を学ぶ全 36 レッスン(665 分)のコースです。ローカルの作品データを題材に、表示とデータを分け、絞り込み・並び替え・入力検証までを組み立てます。Promise、fetch、API 通信、モジュールは次のコースで扱います。

1
土台をそろえる
01. このコースで育てるもの15分
02. strict mode が先に教えてくれる間違い15分
03. 表示とデータを切り分ける20分
04. 第1章まとめクイズ10分
2
配列をパイプラインで扱う
01. map で形を変える20分
02. filter と find で絞り込む20分
03. reduce でひとつにまとめる20分
04. sort と比較関数20分
05. 分類してまとめる groupBy20分
06. つなげて組み立てる20分
07. つくる 作品一覧の絞り込みと並び替え30分
08. 第2章まとめクイズ10分
3
関数を道具にする
01. クロージャで状態を閉じ込める20分
02. 設定を覚えた関数をつくる20分
03. 関数を返す関数20分
04. 副作用のない関数20分
05. 第3章まとめクイズ10分
4
オブジェクトを扱いきる
01. 分割代入で必要な値だけ取り出す20分
02. スプレッドとレストで組み替える20分
03. keys と values と entries20分
04. ビット演算でフラグをまとめる20分
05. 第4章まとめクイズ10分
5
クラスで型をつくる
01. クラスとインスタンス20分
02. private フィールドとアクセサ20分
03. 継承と super20分
04. 多態と static20分
05. つくる 作品コレクションをクラスにする30分
06. 第5章まとめクイズ10分
6
エラーを設計する
01. try catch finally20分
02. 自分でエラーを投げる20分
03. 失敗を画面に出す25分
04. 第6章まとめクイズ10分
7
正規表現
01. 正規表現のきほん20分
02. 入力を検証する20分
03. 置換とキャプチャ20分
04. 第7章まとめクイズ10分

継承と super

子から親へ super で辿る
解説

このレッスンで分かること

  • extends で、既にあるクラスの中身を引き継いだクラスを作れます
  • 子の constructor では super(...) を呼ぶまで this を触れません

同じ代入を、2 つのクラスに書くことになる

作品の中に、トップへ大きく出したい種類が混ざるようになったとします。持っているものはほとんど同じで、短い見出しの文字が 1 つ増えるだけです。素直にクラスをもう 1 つ書くと、こうなります。

JavaScript

class Note { constructor(topic, minutes) { this.topic = topic; this.minutes = minutes; } render() { return `${this.topic} ${this.minutes} 分`; } } class PinnedNote { constructor(topic, minutes, mark) { this.topic = topic; // 同じ this.minutes = minutes; // 同じ this.mark = mark; } render() { return `${this.mark} ${this.topic} ${this.minutes} 分`; } }

代入も表示の組み立ても二重に書いています。あとで「分」を「分間」に変えたくなったとき、直す場所が 2 か所あることに気づかず、片方だけ直します。

extends を書くと、増えた分だけを書けば済みます。

JavaScript

class PinnedNote extends Note { constructor(topic, minutes, mark) { super(topic, minutes); this.mark = mark; } render() { return `${this.mark} ${super.render()}`; } } console.log(new PinnedNote("正規表現", 40, "重要").render()); // 重要 正規表現 40 分

残ったのは、増えた mark と、変わった render だけです。

super は書く場所で意味が変わる

constructor の中の super(...) は、親の constructor を呼びます。これを呼ぶまで、子の constructor では this に触れません。インスタンスの中身は親が作るので、それが終わるまで this がまだ存在しないからです。

JavaScript

class PinnedNote extends Note { constructor(topic, minutes, mark) { this.mark = mark; // ReferenceError super(topic, minutes); } }

メソッドの中の super.render() は、親クラスの同じ名前のメソッドを呼びます。this.render() ではありません。this.render() と書くと上書きしたほう自身がもう一度呼ばれ、それが止まらなくなって RangeError になります。

解説

増やすプロパティが無く、メソッドだけ変えたいときは、子の constructor を丸ごと省略できます。省略すると、受け取った引数をそのまま super に渡す constructor が自動で用意されます。

継承にするか、プロパティで足すか

種類が分かれて見えても、継承が向かない場面があります。判断の材料は、振る舞いまで違うかどうかです。

違いの中身向いている形
持つデータが 1 つ増えるだけプロパティを足す
同じ操作の結果が種類ごとに変わる継承してメソッドを上書きする
途中で種類が入れ替わる継承にしない

インスタンスのクラスは、あとから変えられません。注目から通常へ戻ることがあるなら、その都度作り直すことになるので継承は向きません。迷ったらまず 1 つのクラスで書き、同じ条件で分かれる if が 3 本を超えたときに初めて分けます。

よくある間違い

  • super() を呼ばずに this を触る — extends を書いたら、子の constructor の先頭で super(...) を呼びます。引数を渡し忘れると親の側が全部 undefined になり、こちらはエラーにならないので undefined (undefined) が画面に出てから気づきます
  • super.render() を this.render() と書く — 自分自身を呼び続けて RangeError で止まります。親を呼びたいときは super. です

要件

  1. class Work は constructor で title と year を受け取り、describe() で タイトル (年) を返す
  2. class FeaturedWork extends Work は constructor で title year badge を受け取る。super で親に title と year を渡してから badge を持たせる
  3. FeaturedWork の describe() は super.describe() の結果の後ろに半角スペースと [バッジ] を足した文字列を返す
  4. function buildWorkLines(items) を定義する。item.badge が真なら FeaturedWork、そうでなければ Work を作り、describe() の結果を並べた配列を返す

入出力例

buildWorkLines([{"title":"プロフィールサイト","year":2026},{"badge":"注目","title":"作品ギャラリー","year":2026}]) → ["プロフィールサイト (2026)","作品ギャラリー (2026) [注目]"] buildWorkLines([]) → [] buildWorkLines([{"title":"自己紹介カード","year":2026},{"title":"学習ログ","year":2025}]) → ["自己紹介カード (2026)","学習ログ (2025)"] buildWorkLines([{"badge":"","title":"スキル一覧の表","year":2026}]) → ["スキル一覧の表 (2026)"]

ヒント

先に Work だけを書いて describe() が通ることを確かめます。そのあと extends を足します

子の constructor では super(title, year) を this より先に呼びます。順番を逆にすると ReferenceError です

上書きした describe() の中で this.describe() と書くと自分自身を呼び続けます。親を呼ぶのは super.describe() です

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/03/27·更新 2026/08/26

関連レッスン

  • 多態と static

    同じ名前のメソッドを種類ごとに用意すると、呼ぶ側から if が消えます。static のフィールドで作った件数を数え、static のメソッドをインスタンスを作る窓口にします。

  • つくる 作品コレクションをクラスにする

    第5章で学んだ class と # と extends と static を全部使い、作品 1 件の Work と、その集まりの WorkCollection にまとめます。

  • 第5章まとめクイズ

    class と constructor、# の private フィールド、extends と super、static の 4 つを、コードを読んで結果を答える形で確かめます。

  • try catch finally

    失敗するかもしれない処理を try で囲み、catch で受け止めて finally で後始末する書き方を身につけます。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • クラスデータと振る舞いを束ねる単位
  • インスタンスクラスから生成された実体
  • メソッドクラスに属する関数
  • プロパティメソッドを属性のようにアクセスできるようにするデコレータ。
  • 引数位置引数=順番で渡す。
  • 継承親クラスの機能を子クラスへ引き継ぐ仕組み
  • 判断YES/NO 分岐を表す菱形
  • 配列サイズ固定の同型データの集まり
main.js
学習モード
エディタを読み込んでいます

メモ

継承と super

⌘S で保存