1. 3 件のうち 1 件が 100 回以上
  2. 空の配列
  3. ちょうど 100 回は人気に数える
  4. 99 回は人気に数えない
コース一覧
モダンJavaScript:データ処理とコード設計
クラスとインスタンス

モダン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分

クラスとインスタンス

設計図は 1 つ、実体は別々
解説

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

  • class と constructor で、同じ形のオブジェクトを何個でも作れます
  • メソッドの中の this は、呼び出したインスタンスを指します

データ専用の関数が、データから離れていく

入門では、プロフィールのスキルを素のオブジェクトの配列で持っていました。

JavaScript

const skills = [ { name: "HTML", hours: 12 }, { name: "CSS", hours: 8 } ]; function caption(skill) { return skill.name + " " + skill.hours + " 時間"; } function needsPractice(skill) { return skill.hours < 10; }

caption も needsPractice も、スキルにしか使えない関数です。それなのにスキルのデータとは別の場所に置かれています。あとで hours を minutes に変えると、離れた場所にある関数を全部探して直すことになります。データと、そのデータ専用の処理が離れているのが原因です。

設計図を書いて、実体を作る

class を使うと、その 2 つを同じ波かっこの中に置けます。

JavaScript

class Skill { constructor(name, hours) { this.name = name; this.hours = hours; } caption() { return `${this.name} ${this.hours} 時間`; } needsPractice() { return this.hours < 10; } } const first = new Skill("HTML", 12); console.log(first.caption()); // HTML 12 時間 console.log(first.needsPractice()); // false

new Skill("HTML", 12) を書いたとき、JavaScript は次の順に動きます。

順番起きること
1中身が空のオブジェクトが 1 個作られる
2そのオブジェクトを this として constructor が呼ばれる
3this.name = name などでプロパティが書き込まれる
4できあがったオブジェクトが new 式の値として返る

constructor の中では return を書きません。書かなくても、作られたオブジェクトが返ります。new を書き忘れて Skill("HTML", 12) と呼ぶと TypeError になります。クラスは new なしでは呼べない決まりなので、間違いに気付きやすい形です。

メソッドは、インスタンスを 100 個作っても 100 個には増えません。実体は 1 つで、全インスタンスがそれを見に行きます。this は「どのインスタンスから呼ばれたか」で決まるので、a.caption() なら this は a、b.caption() なら this は b です。

配列をまるごとインスタンスに変える

外から届くデータは素のオブジェクトです。第2章で使った map を通せば、配列ごと変えられます。

JavaScript

const records = [ { name: "HTML", hours: 12 }, { name: "CSS", hours: 8 } ]; const list = records.map((record) => new Skill(record.name, record.hours)); console.log(list.map((skill) => skill.caption())); console.log(list.filter((skill) => skill.needsPractice()).length); // 1

一度インスタンスにしてしまえば、そのあとは map も filter もこれまでどおりです。違うのは、配列の中身が処理のしかたを自分で知っている点です。

解説

クラスは「オブジェクトの新しい書きかた」ではありません。同じ形のものが何個も出てきて、そのすべてに同じ処理をしたいときに効きます。1 個しか作らないなら、素のオブジェクトのままで十分です。

よくある間違い

  • メソッドの間にカンマを書く — オブジェクトリテラルの感覚でカンマを打つと構文エラーです。クラスの本体はカンマで区切りません
  • メソッドの中で this を書き忘れる — ${name} とだけ書くと、インスタンスのプロパティではなく変数を探しに行き、見つからなければ ReferenceError です
  • constructor で値を返そうとする — オブジェクトを return すると new の結果がそれに差し替わり、メソッドを持たない素のオブジェクトができます。this に代入するだけにします

要件

  1. class Work を定義する。constructor は title year views の 3 つを受け取り、同じ名前のプロパティに入れる
  2. Work に label() を持たせる。タイトル (年) の形の文字列を返す。年の前後に半角スペースは入れない
  3. Work に isPopular() を持たせる。views が 100 以上のとき true を返す
  4. function buildWorkSummary(items) を定義する。items は { title, year, views } の配列。すべて Work のインスタンスに変えたうえで { labels, popularCount } を返す

入出力例

buildWorkSummary([{"title":"プロフィールサイト","views":120,"year":2026},{"title":"自己紹介カード","views":48,"year":2026},{"title":"スキル一覧の表","views":32,"year":2026}]) → {"labels":["プロフィールサイト (2026)","自己紹介カード (2026)","スキル一覧の表 (2026)"],"popularCount":1} buildWorkSummary([]) → {"labels":[],"popularCount":0} buildWorkSummary([{"title":"作品ギャラリー","views":100,"year":2026}]) → {"labels":["作品ギャラリー (2026)"],"popularCount":1} buildWorkSummary([{"title":"学習ログ","views":99,"year":2025}]) → {"labels":["学習ログ (2025)"],"popularCount":0}

ヒント

まず class Work を書いて new Work("テスト", 2026, 0) が作れる状態にします。そのあと buildWorkSummary から呼びます

items から Work の配列にするのは map です。そこから labels を作るのも map、popularCount は filter した結果の length です

label() の中で title と書くと ReferenceError です。this.title と書きます

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

関連レッスン

  • private フィールドとアクセサ

    # を先頭に付けたフィールドはクラスの外から触れません。表示回数を # で守り、get と、成否を返すメソッドを窓口にします。

  • 継承と super

    extends で Work を受け継いだ FeaturedWork を作ります。super で親の constructor と親のメソッドを呼び、差分だけを書きます。

  • 多態と static

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

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

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

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

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

  • オブジェクトキーと値のペアで構造を作るデータ
  • メソッドクラスに属する関数
  • インスタンスクラスから生成された実体
  • 関数処理に名前を付けて再利用できる単位
  • 配列サイズ固定の同型データの集まり
  • 処理計算や代入を表す長方形
  • 設計何をどう作るかを決める前工程
  • JavaScriptWeb で動的な振る舞いを担う言語
main.js
学習モード
エディタを読み込んでいます

メモ

クラスとインスタンス

⌘S で保存