「オブジェクト指向(OOP)」は多くの言語で採用されている考え方ですが、言葉が難しく感じられがちです。ここでは、データと処理をひとまとめにして「モノ」として扱うという発想を、具体的なコードで直感的に理解していきます。
オブジェクト指向とは、関連するデータ(状態)とそれを扱う処理(振る舞い)を1つの「オブジェクト」にまとめて設計する考え方です。たとえば「ユーザー」を、名前というデータと「あいさつする」という処理をセットにして扱います。現実の「モノ」に見立てると理解しやすくなります。
クラスは設計図、インスタンスはそこから作られた実体です。「たい焼きの型」がクラス、「焼き上がったたい焼き」がインスタンスと考えるとイメージしやすいでしょう。
class User {
constructor(name) {
this.name = name; // 状態(データ)
}
greet() { // 振る舞い(処理)
return `こんにちは、${this.name}です`;
}
}
const u = new User("田中"); // インスタンス化
console.log(u.greet()); // こんにちは、田中です
オブジェクトの内部データを外から直接いじれないようにし、決められた手続き(メソッド)経由で操作させる考え方です。不正な値が入るのを防ぎ、変更に強くなります。
class Account {
#balance = 0; // 外から触れない
deposit(amount) {
if (amount <= 0) return; // ルールを通す
this.#balance += amount;
}
getBalance() { return this.#balance; }
}
あるクラスの性質を引き継いで、新しいクラスを作れます。共通処理を親にまとめ、差分だけ子で書くことで重複を減らせます。
class Animal {
constructor(name) { this.name = name; }
speak() { return `${this.name}が鳴いた`; }
}
class Dog extends Animal {
speak() { return `${this.name}がワンと鳴いた`; } // 上書き
}
console.log(new Dog("ポチ").speak()); // ポチがワンと鳴いた
「多態性」と訳されます。同じ speak() という呼び出しでも、オブジェクトの種類によって動きが変わる——これにより、呼ぶ側は中身を気にせず統一的に扱えます。
const animals = [new Animal("猫"), new Dog("ポチ")];
for (const a of animals) {
console.log(a.speak()); // それぞれ違う結果になる
}
継承を深く重ねると、かえって追いにくくなります。近年は「継承より合成(コンポジション)」——必要な部品を持たせて組み合わせる方が柔軟だとされる場面も多いです。まずは基本を押さえ、無理に凝った設計を目指さないことが大切です。
クラス・カプセル化・継承・ポリモーフィズム——この4つが理解できれば、オブジェクト指向の入り口は突破です。頭で覚えるより、実際に小さなクラスを書いて動かすのが近道。progoのエディタでそのまま試せます。
▼ ブラウザですぐにコードを試せます(インストール不要)
▶ エディタでクラスを実行する