JavaScript クラス練習問題集(初心者向け)
初心者でもステップアップできる課題セット(全5問) を作りました。
順番にやっていくと、クラスの基礎 → メソッド → アクセサ → 継承 → 静的メソッド、という流れで自然に身につきます。
レベル1:クラスの基本を作ろう
課題:Person クラスを作って、名前と年齢を持てるようにしてください。
条件:
- クラス名:
Person - コンストラクタで
nameとageを受け取る introduce()メソッドで「私は〇〇、〇歳です」と表示
例:
const p = new Person("太郎", 20);
p.introduce();
// 出力:私は太郎、20歳です
JavaScriptレベル2:メソッドで動きをつけよう
課題:Counter クラスを作り、数字を数える動作を実装しよう。
条件:
- プロパティ:
count(初期値 0) - メソッド:
increment()→ count を 1 増やすdecrement()→ count を 1 減らすshow()→ 現在の count を表示
例:
const c = new Counter();
c.increment();
c.increment();
c.show(); // 現在のカウント: 2
JavaScriptレベル3:getter / setter を使ってみよう
課題:Rectangle クラスを作って、面積を プロパティ風 に取得できるようにしよう。
条件:
- プロパティ:
width,height get area()を定義して、width * heightを返すset widthとset heightで、負の値を拒否(エラーを投げる)
例:
const rect = new Rectangle(5, 10);
console.log(rect.area); // 50
rect.width = -2; // エラー:幅は正の値でなければなりません
JavaScriptレベル4:クラスの継承に挑戦!
課題:Animal クラスを作り、そこから Dog クラスを継承させてみよう。
条件:
Animalクラスにnameとspeak()メソッドを持たせるspeak()は「(名前)が鳴いた!」を表示
DogクラスはAnimalを継承し、speak()をオーバーライドして「ワンワン!」を表示するsuper()を使って親のコンストラクタを呼ぶ
例:
const dog = new Dog("ポチ");
dog.speak(); // ポチがワンワン!と鳴いた!
JavaScriptレベル5:静的メソッドを作ろう
課題:MathTool クラスを作って、インスタンスを作らなくても使える計算ツールを作ろう。
条件:
- 静的メソッド
add(a, b)→ a + b を返す - 静的メソッド
average(arr)→ 配列の平均値を返す new MathTool()で使おうとするとエラーになるようにする(※ヒント:constructor内で throw)
例:
console.log(MathTool.add(3, 7)); // 10
console.log(MathTool.average([1,2,3])); // 2
JavaScriptボーナス課題(中級)
Bookクラスを作って、BookListクラスで複数の本を管理するシステムを作ってみよう。
追加・削除・検索などをメソッド化すると、オブジェクト設計の力がつきます!
練習のコツ
- すぐに MDN を見ずに、「どう書けばいいかな?」を考えてみる。
- クラス名は大文字で始めるのが慣習(例:
Person,Rectangle) thisは「そのインスタンス自身」を指す- 継承では
super()を忘れない!
では、先ほどの クラス練習問題(全5問) に、模範解答+解説つき の完全版をお届けします。
初心者でも「なぜこう書くのか」がちゃんと理解できるように、丁寧にコメントとポイントをつけています。
JavaScript クラス練習問題(模範解答&解説つき)
レベル1:クラスの基本を作ろう
課題
Person クラスを作って、名前と年齢を持てるようにしてください。
模範解答
class Person {
constructor(name, age) {
// インスタンスが作られたときに実行される
this.name = name;
this.age = age;
}
// メソッド(インスタンスごとに使える関数)
introduce() {
console.log(`私は${this.name}、${this.age}歳です`);
}
}
const p = new Person("太郎", 20);
p.introduce(); // 私は太郎、20歳です
JavaScript解説
constructor()はクラスの「設計図が実体化されるとき」に呼ばれます。thisは「作られたそのオブジェクト自身」を指します。introduce()はプロトタイプメソッドとして共有されるため、
たくさんのPersonを作ってもメモリ効率が良いです。
レベル2:メソッドで動きをつけよう
課題
Counter クラスを作り、数字を数える動作を実装。
模範解答
class Counter {
constructor() {
this.count = 0; // 初期値
}
increment() {
this.count++;
}
decrement() {
this.count--;
}
show() {
console.log(`現在のカウント: ${this.count}`);
}
}
const c = new Counter();
c.increment();
c.increment();
c.show(); // 現在のカウント: 2
JavaScript解説
this.countは各インスタンスが自分で持っているデータ。increment()やdecrement()はインスタンスごとに動作。- 実際のアプリではクリック回数やスコア管理などに応用できます。
レベル3:getter / setter を使ってみよう
課題
Rectangle クラスを作って、area プロパティで面積を取得できるように。
模範解答
class Rectangle {
constructor(width, height) {
this.width = width;
this.height = height;
}
// width の setter
set width(value) {
if (value <= 0) {
throw new Error("幅は正の値でなければなりません");
}
this._width = value; // 内部用に _ をつけて区別
}
// width の getter
get width() {
return this._width;
}
// height の setter
set height(value) {
if (value <= 0) {
throw new Error("高さは正の値でなければなりません");
}
this._height = value;
}
// height の getter
get height() {
return this._height;
}
// 面積をプロパティ風に取得できる
get area() {
return this.width * this.height;
}
}
const rect = new Rectangle(5, 10);
console.log(rect.area); // 50
rect.width = -2; // エラー: 幅は正の値でなければなりません
JavaScript解説
get/setを使うと、「プロパティのように見えるメソッド」が作れます。
→rect.areaは関数呼び出しに見えないけど、実際はget area()が呼ばれています。_widthのような内部変数は慣習的に「外から直接触らない」ことを示す記法。- 実際には
#widthのようなプライベートフィールドも使えます(より安全)。
レベル4:クラスの継承に挑戦!
課題
Animal クラスを作り、そこから Dog を継承して鳴く動作を変える。
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name}が鳴いた!`);
}
}
class Dog extends Animal {
constructor(name) {
// 親クラスのコンストラクタを呼ぶ
super(name);
}
// speak() をオーバーライド
speak() {
console.log(`${this.name}がワンワン!と鳴いた!`);
}
}
const dog = new Dog("ポチ");
dog.speak(); // ポチがワンワン!と鳴いた!
JavaScript解説
extendsを使うと、親クラス(Animal)の機能を引き継げます。super(name)は「親の constructor を呼ぶ」特別な関数。- 同名メソッドを定義すると、親のメソッドを上書き(オーバーライド)できます。
- JavaScript のクラス継承は「プロトタイプチェーン」で内部的に実現されています。
レベル5:静的メソッドを作ろう
課題
MathTool クラスを作って、new しなくても呼べる計算ツールに。
模範解答
class MathTool {
constructor() {
// new されたらエラーを出す
throw new Error("MathToolはインスタンス化できません");
}
// 静的メソッドはインスタンスを作らずに呼べる
static add(a, b) {
return a + b;
}
static average(arr) {
const sum = arr.reduce((a, b) => a + b, 0);
return sum / arr.length;
}
}
console.log(MathTool.add(3, 7)); // 10
console.log(MathTool.average([1, 2, 3])); // 2
// const m = new MathTool(); // → エラー
JavaScript解説
staticをつけると、newせずにMathTool.add()のように呼べます。- 静的メソッドは「インスタンス固有ではない処理(汎用的なツール)」に向いています。
- 実際の開発では「ユーティリティ関数」や「ヘルパークラス」によく使われます。
まとめ:ここで学べること
| 機能 | 概要 | キーワード |
|---|---|---|
| コンストラクタ | 初期化処理を書く | constructor() |
| インスタンスメソッド | 各オブジェクトが使える機能 | this.method() |
| getter/setter | プロパティ風の読み書き制御 | get / set |
| 継承 | 親クラスの機能を引き継ぐ | extends, super() |
| 静的メソッド | クラス全体で共有する関数 | static |
