カテゴリ: JavaScript 更新日: 2026/06/11

JavaScriptでオブジェクト指向のカプセル化を学ぶ!初心者でもわかるクラスとプロパティの保護方法

JavaScriptでオブジェクト指向のカプセル化を実装する方法
JavaScriptでオブジェクト指向のカプセル化を実装する方法

先生と生徒の会話形式で理解しよう

生徒

「先生、JavaScriptでオブジェクトの中のデータを隠したいときってどうするんですか?」

先生

「それはカプセル化という考え方を使います。クラスやオブジェクトの内部データを直接触れないようにして、専用のメソッドでのみアクセスできるようにするんです。」

生徒

「専用のメソッドってどんなものですか?」

先生

「getterやsetterと呼ばれるメソッドです。データを安全に取得したり、変更したりできます。」

1. JavaScriptのカプセル化とは?

1. JavaScriptのカプセル化とは?
1. JavaScriptのカプセル化とは?

カプセル化とは、オブジェクト指向プログラミングの基本概念のひとつで、データとその操作をひとまとめにし、外部から不必要にアクセスされないようにすることです。JavaScriptではクラスや関数を使って、内部の変数を隠すことができます。これにより、データの安全性やコードの保守性が向上します。

2. クラスを使った基本的なカプセル化

2. クラスを使った基本的なカプセル化
2. クラスを使った基本的なカプセル化

JavaScriptのクラスでは、プロパティの前に#をつけることで、プライベート変数として扱えます。外部から直接アクセスできず、クラス内のメソッド経由で操作します。


class Person {
  #name; // プライベート変数

  constructor(name) {
    this.#name = name;
  }

  getName() {
    return this.#name;
  }

  setName(newName) {
    this.#name = newName;
  }
}

const person = new Person("太郎");
console.log(person.getName()); // 太郎
person.setName("次郎");
console.log(person.getName()); // 次郎

3. プライベート変数のメリット

3. プライベート変数のメリット
3. プライベート変数のメリット

プライベート変数を使うと、外部から誤ってデータを変更されるリスクを減らせます。たとえば、直接person.#nameのようにアクセスしようとするとエラーになります。この仕組みにより、データの一貫性が保たれます。

4. GetterとSetterを使ったアクセス制御

4. GetterとSetterを使ったアクセス制御
4. GetterとSetterを使ったアクセス制御

getterとsetterを使うと、変数の取得や設定時に追加処理を入れられます。例えば、名前の長さをチェックして不正な値を防ぐことができます。


class Person {
  #name;

  constructor(name) {
    this.#name = name;
  }

  get name() {
    return this.#name;
  }

  set name(newName) {
    if(newName.length < 10) {
      this.#name = newName;
    } else {
      console.log("名前が長すぎます");
    }
  }
}

const person = new Person("太郎");
person.name = "次郎太郎"; // 名前が長すぎます
console.log(person.name); // 太郎

5. コンストラクタで初期値を安全に設定

5. コンストラクタで初期値を安全に設定
5. コンストラクタで初期値を安全に設定

コンストラクタでプライベート変数に初期値を設定することで、オブジェクト作成時に必ず正しい値が入るようにできます。


class BankAccount {
  #balance;

  constructor(initialBalance) {
    this.#balance = initialBalance > 0 ? initialBalance : 0;
  }

  getBalance() {
    return this.#balance;
  }
}

const account = new BankAccount(-100);
console.log(account.getBalance()); // 0

6. クロージャを使ったカプセル化

6. クロージャを使ったカプセル化
6. クロージャを使ったカプセル化

クラスを使わず、関数とクロージャを使ってデータを隠す方法もあります。関数内で定義した変数は外部から直接アクセスできません。


function createCounter() {
  let count = 0; // プライベート変数

  return {
    increment() {
      count++;
      return count;
    },
    getCount() {
      return count;
    }
  };
}

const counter = createCounter();
console.log(counter.increment()); // 1
console.log(counter.getCount());  // 1
console.log(counter.count);       // undefined

7. カプセル化でコードを保守しやすくする

7. カプセル化でコードを保守しやすくする
7. カプセル化でコードを保守しやすくする

カプセル化を使うことで、オブジェクト内部の構造を外部に公開せずに済むため、後で変更しても外部コードに影響を与えにくくなります。大規模なプログラムでも安心して機能追加や修正が可能です。

8. 実践例:ユーザー情報を安全に管理

8. 実践例:ユーザー情報を安全に管理
8. 実践例:ユーザー情報を安全に管理

以下の例では、ユーザーのパスワードをプライベート変数にして、外部から直接取得できないようにしています。安全に変更や確認ができるメソッドだけを提供しています。


class User {
  #password;

  constructor(password) {
    this.#password = password;
  }

  checkPassword(input) {
    return input === this.#password;
  }

  updatePassword(newPassword) {
    if(newPassword.length >= 6) {
      this.#password = newPassword;
    } else {
      console.log("パスワードは6文字以上で設定してください");
    }
  }
}

const user = new User("secret123");
console.log(user.checkPassword("secret123")); // true
user.updatePassword("abc"); // パスワードは6文字以上で設定してください

9. まとめると

9. まとめると
9. まとめると

JavaScriptでのカプセル化は、クラスのプライベート変数やクロージャを使って実現できます。getterやsetterを使うことで、安全にデータを操作でき、外部からの不正アクセスを防ぐことができます。カプセル化を意識してコードを書くことで、保守性や安全性が高まります。

まとめ

まとめ
まとめ

本記事では、JavaScriptにおけるオブジェクト指向のカプセル化について、初心者でも理解できるように丁寧に解説しました。カプセル化とは、オブジェクトの内部データを外部から直接アクセスできないように保護し、専用のメソッドを通してのみ操作できる仕組みです。JavaScriptでは、クラスのプライベート変数として#を使った方法や、getterとsetterを活用したアクセス制御、コンストラクタでの安全な初期値設定、さらにクロージャを活用する方法など、さまざまな手段でカプセル化を実現できます。これにより、オブジェクトのデータ一貫性が保たれ、不正な操作や予期せぬバグを防止することが可能です。

プライベート変数を使うことで、外部コードがオブジェクト内部の状態に直接干渉できなくなるため、プログラムの保守性が向上します。特に大規模なアプリケーションでは、内部データの変更が外部に影響を及ぼさないことが重要であり、カプセル化の概念を理解して実装することが不可欠です。また、getterやsetterを活用することで、値のバリデーションや条件付きの処理を組み込むことができ、安全なデータ操作を保証できます。

クロージャを用いたカプセル化は、クラスを使わずに関数だけでプライベート変数を実現する方法として有効です。これにより、特定の関数内部でのみアクセス可能な変数を作ることができ、外部からの操作を完全に遮断できます。この手法は、カウンターや設定情報の管理など、簡易的なデータ保護を行う場面で特に有効です。

カプセル化を意識したコード設計は、データの安全性を高めるだけでなく、コードの読みやすさや拡張性にも寄与します。オブジェクトの内部実装を隠すことで、外部に影響を与えずに機能の追加や修正を行うことができるため、長期的なプロジェクトにおいて非常に有効です。JavaScriptのクラスやクロージャを活用して、安全で保守性の高いオブジェクト指向プログラミングを実践しましょう。

以下は、ユーザー情報を安全に管理するカプセル化の実践例です。パスワードはプライベート変数として保持され、getterやsetterを通じてのみ安全にアクセスできます。外部から直接アクセスできないため、セキュリティ上のリスクも低減されます。

 class SecureUser { #password;
constructor(password) {
this.#password = password;
}

checkPassword(input) {
return input === this.#password;
}

updatePassword(newPassword) {
if(newPassword.length >= 6) {
this.#password = newPassword;
console.log("パスワードを更新しました");
} else {
console.log("パスワードは6文字以上で設定してください");
}
}
}

const secureUser = new SecureUser("mypassword");
console.log(secureUser.checkPassword("mypassword")); // true
secureUser.updatePassword("abc"); // パスワードは6文字以上で設定してください
secureUser.updatePassword("newpass123"); // パスワードを更新しました
console.log(secureUser.checkPassword("newpass123")); // true

このようにカプセル化を正しく実装することで、JavaScriptのオブジェクト指向プログラミングはより安全で拡張性の高いものとなります。クラスや関数の内部構造を隠すことで、外部コードに依存せず、柔軟にメンテナンスや改良が可能となります。

先生と生徒の振り返り会話

生徒

「先生、カプセル化を使うと本当に安全にデータを守れるんですね。クロージャを使った方法もあるって聞きましたが、どういうときに使うんですか?」

先生

「クロージャを使ったカプセル化は、クラスを使わずに特定の関数内で変数を隠したいときに便利です。たとえば、カウンターの値や設定情報など、外部から触られたくないデータを関数単位で管理する場合に使います。」

生徒

「なるほど。クラスのプライベート変数とクロージャ、どっちが良いんでしょう?」

先生

「大規模なアプリケーションやオブジェクト指向的な設計では、クラスのプライベート変数を使うほうが管理しやすいです。一方、軽量な関数単位のデータ保護ならクロージャでも十分です。状況に応じて使い分けることが大切です。」

生徒

「getterやsetterで値をチェックできるのも便利ですね。長さ制限とか条件を付けられるんですね。」

先生

「そうです。データにルールを設けて、不正な値の設定を防ぐことができます。カプセル化は単に隠すだけでなく、安全なデータ管理を可能にする考え方なんです。」

生徒

「これで大規模なプロジェクトでも安心してコードを書けますね。カプセル化の重要性がよくわかりました。」

先生

「その通りです。カプセル化を意識した設計は、安全性と保守性を両立させ、将来の拡張や修正にも強いコードを書けるようになります。」

カテゴリの一覧へ
新着記事
New1
JavaScript
JavaScriptのスコープとは?ローカル変数・グローバル変数の違いと使い分け
New2
TypeScript
TypeScriptで型の合成時に発生する型エラーの対処法を徹底解説!初心者にもわかりやすく解説
New3
TypeScript
TypeScriptでAPI呼び出しをラップするユーティリティ関数の設計完全ガイド!初心者向けにAxiosやFetchの使い方を解説
New4
TypeScript
TypeScriptのMapped Typesとインターフェースの連携方法を徹底解説!初心者でも理解できる型変換の基本
人気記事
No.1
Java&Spring記事人気No1
JavaScript
JavaScriptのループで無限ループが起きる原因と対策を初心者向けに徹底解説!
No.2
Java&Spring記事人気No2
JavaScript
JavaScriptのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.3
Java&Spring記事人気No3
JavaScript
JavaScriptの文字列の長さを取得する(lengthプロパティ)
No.4
Java&Spring記事人気No4
TypeScript
TypeScriptのファイル分割とimport/exportの基本を徹底解説!初心者でも安心のやさしい入門
No.5
Java&Spring記事人気No5
TypeScript
TypeScriptでコメントを書く正しい書き方と使い分け【初心者向けにやさしく解説】
No.6
Java&Spring記事人気No6
TypeScript
TypeScriptの始め方:開発環境の構築手順【初心者向け】
No.7
Java&Spring記事人気No7
JavaScript
JavaScriptのプリミティブ型と参照型の違いを初心者向けに解説
No.8
Java&Spring記事人気No8
TypeScript
TypeScriptでパスエイリアスを設定する方法!baseUrlとpathsでコードをスッキリ整理