JavaScript オブジェクトを初心者向けに解説、追加、削除、コンストラクタ、new演算子なども解説|JavaScript入門講座(8)

JavaScript
この記事は約15分で読めます。

JavaScript オブジェクトを初心者向けに解説、追加、削除、コンストラクタ、new演算子なども解説|JavaScript入門講座(8)のpODCAST

下記のPodcastは、Geminiで作成しました。

はじめに

JavaScriptというプログラミング言語において、オブジェクトはデータと機能を管理するための最も基本的かつ強力な構造です。変数には一つの値しか保存できませんが、オブジェクトを利用することで、関連する複数のデータ(プロパティ)や動作(メソッド)を一つのパッケージとして扱うことが可能になります。現実世界における「車」がメーカー、モデル、色といった属性を持ち、「走る」「止まる」といった機能を持つのと同じように、JavaScriptのオブジェクトも複雑な実体をデジタル上で表現するために設計されています。本稿では、現代的なJavaScript開発におけるオブジェクトの基礎から、その操作、高度な生成手法であるコンストラクタやクラス、および最新のECMAScript仕様に至るまでを、初心者の方にも分かりやすく体系的に解説します。

JavaScriptにおけるオブジェクトの概念

オブジェクトとは、一言で言えば「名前(キー)と値(バリュー)のペアの集合」です。JavaScriptのほとんどの要素はオブジェクトとしての側面を持っており、これを理解することは言語を習得する上での通過点ではなく、中心的な土台を築く作業に他なりません。

オブジェクトの構造:プロパティとメソッド

オブジェクトに含まれる個々のデータは「プロパティ」と呼ばれます。プロパティの値が文字列や数値であれば単なるデータですが、その値が関数である場合、それは「メソッド」と呼ばれ、オブジェクトが実行できる動作を定義します。

用語意味
プロパティオブジェクトが持つ属性やデータname: "田中", age: 20
キー (名前)データを識別するためのラベルname, age, greet
値 (バリュー)キーに紐付けられた具体的な内容"田中", 20, function(){...}
メソッドオブジェクトに関連付けられた関数greet()

オブジェクトリテラルによる作成

最も一般的で推奨されるオブジェクトの作成方法は「オブジェクトリテラル」を使用することです。これは中括弧 {} を用いて、その中にキーと値を記述する直感的な手法です。

javascript

const user = {
  name: "山田太郎",
  age: 25,
  isStudent: false,
  greet: function() {
    console.log("こんにちは!");
  }
};

このように、関連する情報をひとまとめにすることで、コードの可読性とメンテナンス性が飛躍的に向上します。

オブジェクトの基本操作:アクセス・追加・削除

オブジェクトを作成した後は、その中身を読み取ったり、新しい情報を追加したり、不要になったデータを削除したりする必要があります。JavaScriptは柔軟性が高く、実行中にオブジェクトの構造を動的に変更することが可能です。

プロパティへのアクセス手法

プロパティにアクセスする方法には「ドット記法」と「ブラケット記法」の2種類があります。

ドット記法

user.name のように、オブジェクト名とキーをドットで繋ぐ方法です。最も一般的で簡潔な書き方ですが、キーが変数名としてのルール(識別子の規則)を満たしている必要があります。

ブラケット記法

user["name"] のように、オブジェクト名に続けて角括弧 `` を使い、その中にキーを文字列として記述する方法です。この手法の最大の利点は、キーを動的に指定できる点にあります。例えば、変数に格納された文字列を使ってプロパティを参照したい場合や、プロパティ名にハイフンが含まれる場合には、ブラケット記法が必須となります。

プロパティの追加と更新

既存のオブジェクトに新しいデータを追加するのは非常に簡単です。存在しないキーに対して値を代入するだけで、自動的に新しいプロパティが作成されます。

javascript

const car = { make: "Toyota" };
car.model = "Corolla"; // 新しいプロパティの追加
car.make = "Honda";    // 既存プロパティの更新

このように、オブジェクトはプログラムの実行状況に合わせて成長させることができる「ミュータブル(変更可能)」なデータ構造です。

delete演算子による削除

特定のプロパティを完全に削除したい場合は delete 演算子を使用します。単に値を undefined や null に設定するのとは異なり、オブジェクトからそのキー自体を消し去ることができます。

javascript

const member = { id: 1, name: "佐藤" };
delete member.id;
console.log(member); // { name: "佐藤" }

ただし、大規模なアプリケーションでパフォーマンスを追求する場合、頻繁な delete はJavaScriptエンジンの最適化を妨げる可能性があるため注意が必要です。そのような場合は、後述する Map オブジェクトの検討が推奨されることもあります。

コンストラクタ関数とnew演算子の仕組み

同じ構造を持つオブジェクトを大量に作成する必要がある場合、毎回オブジェクトリテラルを手書きするのは非効率であり、ミスを誘発します。そこで利用されるのが「コンストラクタ関数」と new 演算子です。

コンストラクタ関数の役割

コンストラクタ関数は、新しいオブジェクトを生成するための「設計図」のような役割を果たす関数です。技術的には通常の関数と同じですが、慣習として「名前の先頭を大文字にする(PascalCase)」というルールがあります。

javascript

function Person(name, age) {
  this.name = name;
  this.age = age;
}

関数内では this というキーワードを使って、これから作られる新しいオブジェクトにプロパティを設定していきます。

new演算子が実行する4つのステップ

new Person("佐藤", 30) のように new を付けて関数を呼び出したとき、JavaScriptの内部では魔法のような4つのステップが実行されています。

1. 空のオブジェクトの生成: 最初に、プロパティを何も持たない新しいオブジェクトがメモリ上に作成されます。

2. プロトタイプの結合: 作成されたオブジェクトの内部的なリンク([[Prototype]])が、コンストラクタ関数の prototype プロパティに向けられます。これにより、共通のメソッドを継承できるようになります。

3. thisのバインドと実行: 新しいオブジェクトが this の値として設定され、コンストラクタ関数内のコードが実行されます。これにより、個別のデータが書き込まれます。

4. オブジェクトの返却: 関数が明示的に別のオブジェクトを返却するように書かれていない限り、自動的にこの新しいオブジェクトが関数の戻り値として返されます。

new.targetによる安全性の向上

初心者がよく犯す間違いとして、new を付け忘れてコンストラクタ関数を呼び出してしまうことがあります。これを防ぐために、モダンなJavaScriptでは new.target というプロパティを使用して、関数が正しく new を伴って呼び出されたかをチェックすることができます。

クラス構文(ES6以降)による現代的なオブジェクト定義

ES2015(ES6)からは、従来のコンストラクタ関数をより洗練された形で記述できる「クラス(class)」構文が登場しました。これは Java や C++ といった他のオブジェクト指向言語に近い書き方を可能にするもので、内部的には前述のコンストラクタとプロトタイプの仕組みを利用していますが、開発者にとってはより読みやすく、エラーの少ないコードを書く手段となります。

クラスの基本構造とメリット

クラスでは constructor という名前の特別なメソッドの中で初期化を行います。また、クラス内に定義したメソッドは自動的にすべてのインスタンスで共有されるため、メモリ効率が非常に良いという特徴があります。

javascript

class User {
  constructor(name) {
    this.name = name;
  }

  sayHi() {
    console.log(`こんにちは、${this.name}です。`);
  }
}

const user1 = new User("田中");

クラスは new を付けずに呼び出すと必ずエラー(TypeError)を発生させるため、従来の関数型コンストラクタよりも安全性が高いと言えます。

プライベートフィールド(#)の活用

近年のアップデート(ES2022以降)により、プロパティ名の前に # を付けることで、クラスの外側からは決してアクセスできない「プライベートプロパティ」を作成できるようになりました。これは「カプセル化」と呼ばれる重要な概念で、オブジェクトの内部状態を不用意に変更されるリスクを減らし、堅牢なプログラムを作成するために役立ちます。

プロトタイプ継承とオブジェクトの深淵

JavaScriptのオブジェクト指向を理解する上で最も難解とされるのが「プロトタイプ継承」です。しかし、その本質は非常にシンプルです。

プロトタイプチェーンの仕組み

すべてのオブジェクトは、自身の親となるオブジェクトへのリンクを持っています。もし、あるオブジェクトに存在しないプロパティにアクセスしようとした場合、JavaScriptエンジンはその親(プロトタイプ)へと遡って探しに行きます。この連鎖を「プロトタイプチェーン」と呼びます。

自分自身: プロパティがあるか確認。

親 (Prototype): なければ親のオブジェクトを確認。

Object.prototype: すべてのオブジェクトの根源であるここでも見つからなければ、初めて undefined を返す。

この仕組みのおかげで、私たちは自分で定義したわけではない toString() のような便利な機能を、あらゆるオブジェクトで使うことができるのです。

現代JavaScriptの最新機能とベストプラクティス

JavaScriptは常に進化しており、2024年から2025年にかけても、オブジェクト操作をより便利にする新機能が続々と標準化されています。

Object.groupBy (ES2024)

大量のオブジェクトを含む配列を、特定の条件でグループ化したい場面はよくあります。以前は複雑なループ処理が必要でしたが、最新の Object.groupBy を使えば驚くほど簡単に実装できます。

javascript

const inventory = [
  { name: "リンゴ", type: "果物" },
  { name: "キャベツ", type: "野菜" },
  { name: "バナナ", type: "果物" }
];

const grouped = Object.groupBy(inventory, item => item.type);
// 結果: { 果物: [{...}, {...}], 野菜: [{...}] }

Mapオブジェクトとの使い分け

初心者のうちは、すべてのキー・値ペアをオブジェクトで管理してしまいがちですが、現代的な開発では Map オブジェクトとの使い分けが重要です。

特徴オブジェクトMap
主な用途構造化されたデータの表現辞書やハッシュマップ
キーの型文字列またはSymbolのみどんな型でも可能(オブジェクトも可)
順序の保証厳密ではない挿入順が保証される
反復処理少し手間がかかるそのままループ(for...of)が可能

データの構造が固定されている場合はオブジェクトを、データの個数や内容が頻繁に変わる「リスト」のような使い方の場合は Map を選択するのが賢明な判断です。

スプレッド構文による不変性の維持

現代のフロントエンド開発、特にReactなどのフレームワークを使用する場合、オブジェクトを直接変更(破壊的変更)するのではなく、元のデータを保ったまま新しいオブジェクトを作る「イミュータブル(不変)」な操作が強く推奨されます。これにはスプレッド構文 ... が非常に役立ちます。

javascript

const oldUser = { name: "田中", age: 20 };
const newUser = {...oldUser, age: 21 }; // 田中という名前を維持しつつ、年齢だけ変えた新しいオブジェクト

オブジェクト設計における選択基準

JavaScriptにはオブジェクトを作る方法が複数あるため、どれを使うべきか迷うこともあるでしょう。状況に応じた最適な選択肢を以下の表にまとめます。

手法適した場面理由
リテラル単発のデータ管理、設定値の受け渡し最最もシンプルでオーバーヘッドが少ないため。
コンストラクタレガシーなコードの保守、特定の動作を模倣したい場合古いブラウザ環境でも確実に動作するため。
クラス (class)大規模な開発、明確な階層構造が必要な場合構文が整理されており、継承やプライベート変数が扱いやすいため。
Object.create特殊なプロトタイプ継承を行いたい場合コンストラクタを介さず直接オブジェクトを親に指定できるため。

初心者のうちは、まずは「オブジェクトリテラル」でデータのまとめ方を学び、その後、複数の同じような部品を作る必要があるときに「クラス」へと進むのが、最も効率的な学習ステップです。

将るの展望:ES2025とそれ以降

JavaScriptのオブジェクト操作は今後もさらに進化していきます。現在提案されている機能の一つに「パターンマッチング(Pattern Matching)」があります。これはオブジェクトの形状に基づいて処理を分岐させる強力な仕組みで、これまで if や switch で複雑に書いていたロジックを劇的に簡潔にする可能性を秘めています。また、日付と時刻を扱うための新しい組み込みオブジェクト Temporal の導入も進んでおり、従来の Date オブジェクトが抱えていた多くの問題が解決されようとしています。このように、JavaScriptは常に「より書きやすく、よりバグの少ない」言語へと成長し続けています。

まとめ:オブジェクトを使いこなすために

JavaScriptにおいてオブジェクトを理解することは、言語の真の力を引き出す鍵となります。最初は単なる「データの詰め合わせ」として使い始め、徐々にメソッドによる動作の追加、そしてクラスによる構造化へとステップアップしていってください。本稿で解説した「追加」「削除」「コンストラクタ」「new演算子」といった概念は、一見すると複雑に見えるかもしれませんが、すべては「複雑な情報を整理して、効率よくプログラムを動かす」という一つの目的のために存在しています。最新のES2024・2025の機能も取り入れつつ、モダンなJavaScript開発を楽しんでいきましょう。

参考資料

1. new 演算子 - JavaScript | MDN, https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/new

2. オブジェクトを利用する - JavaScript | MDN, https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Working_with_objects

3. クラスの使用 - JavaScript | MDN, https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Using_classes

4. オブジェクト · JavaScript Primer #jsprimer, https://jsprimer.net/basic/object/

5. クラス · JavaScript Primer #jsprimer, https://jsprimer.net/basic/class/

6. コンストラクタ, 演算子 "new", https://ja.javascript.info/constructor-new

7. Object basics - Learn web development | MDN, https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Scripting/Object_basics

8. Modern JavaScript Best Practices You Should Follow in 2025, https://ashishmisal.medium.com/modern-javascript-best-practices-you-should-follow-in-2025-74a5a73887db

9. JavaScript ES2025 Features You Should Start Using Today, https://medium.com/@vishalthakur2463/javascript-es2025-features-you-should-start-using-today-f594cb05be6b

10. Mastering Modern JavaScript (ECMAScript 2024-2025), https://community.ibm.com/community/user/blogs/krunal-vachheta/2025/11/15/mastering-modern-javascript-ecmascript-2024-2025

11. JavaScript constructor function vs class for beginners explanation, https://www.reddit.com/r/learnjavascript/comments/uqo6n7/what_is_the_difference_between_class_and/

12. JavaScript objects, constructor, new operator tutorial, https://jsprimer.net/basic/prototype-object/

13. Constructor Functions vs. Class Definitions in JavaScript: Who Wins?, https://levelup.gitconnected.com/constructor-functions-vs-class-definitions-in-javascript-who-wins-1ec08efb2591

14. Understanding JavaScript Constructors: Function vs Class, https://medium.com/@hridoymahmud/understanding-javascript-constructors-function-vs-class-63d140a44288

15. In JavaScript, what are the differences between a class and a constructor?, https://stackoverflow.com/questions/46820121/in-javascript-what-are-the-differences-between-a-class-and-a-constructor-

コメント

タイトルとURLをコピーしました