概要
JavaScript には、最初から利用できる 組み込みオブジェクト(Built-in Objects) が多数用意されています。
これらの中にはnewキーワードを使って インスタンスを生成できるもの と、
newを使えず そのまま利用するもの が存在します。
つまり、
「new が使えるかどうかの違いは、その組み込みオブジェクトが
インスタンス(状態を持つ実体)を生成する設計か、
機能をまとめた名前空間(ユーティリティ)として設計されているかの違い」
です。
この記事では、
-
newが使える組み込みオブジェクト -
newが使えない組み込みオブジェクト - その設計思想の違い
を整理して解説します。
目次
new キーワードの役割
new は、コンストラクタ関数やクラスから新しいオブジェクト(インスタンス)を生成するためのキーワードです。
const date = new Date();
内部的には次の処理が行われています。
- 空のオブジェクトを作成
-
thisをそのオブジェクトに束縛 - コンストラクタを実行
- オブジェクトを返す
👉 new は「状態を持つ実体を作る」ための仕組みです。
new が使える組み込みオブジェクト
new が使える組み込みオブジェクトには、次の共通点があります。
- インスタンスを生成する
- インスタンスごとに状態を持つ
-
prototypeにメソッドが定義されている
代表例
new Date();
new Map();
new Set();
new Error("error");
new Promise(() => {});
例:Date
const d1 = new Date();
const d2 = new Date("2025-01-01");
- それぞれ異なる日時という 状態 を持つ
- インスタンスを作る意味がある
new が使えない組み込みオブジェクト
new が使えない組み込みオブジェクトは、
インスタンスを生成しない設計になっています。
共通点
- 状態を持たない
- すべて static なメソッドや定数
- 名前空間(ユーティリティ)として機能する
代表例
Math
JSON
Reflect
Atomics
例:Math
Math.random();
Math.max(1, 2, 3);
new Math(); // TypeError
new が使える/使えない理由の違い
| 観点 |
new が使える |
new が使えない |
|---|---|---|
| 設計 | インスタンス生成 | 名前空間 |
| 状態 | 持つ | 持たない |
| this | 使用する | 使用しない |
| 主な役割 | データ保持 | 処理・変換 |
👉 「状態を持つかどうか」 が決定的な違いです。
Date と Math の比較
Date(new が必要)
const now = new Date();
- 時刻という状態を保持
- インスタンスごとに異なる値を持つ
Math(new 不可)
Math.random();
- 計算処理のみ
- 状態を持たない
- 1つだけあれば十分
活用例
1. 状態を持つ処理では new を使う(Map)
const userMap = new Map();
userMap.set("id", 1);
userMap.set("name", "Taro");
console.log(userMap.get("name")); // Taro
- データを保持・更新する必要がある
- インスタンスを生成する意味がある
2. 計算・変換処理では new を使わない(Math)
const numbers = [3, 8, 1];
const max = Math.max(...numbers);
console.log(max); // 8
- 状態を持たない
- 関数として呼び出すだけで完結
3. 非同期処理の状態管理では new を使う(Promise)
const promise = new Promise((resolve) => {
setTimeout(() => resolve("done"), 1000);
});
promise.then(result => console.log(result));
- pending / fulfilled / rejected という状態を持つ
- インスタンスごとに処理の流れが異なる
4. エラー情報を保持する場合は new を使う(Error)
function divide(a, b) {
if (b === 0) {
throw new Error("0で割ることはできません");
}
return a / b;
}
- メッセージやスタックトレースという状態を保持
5. 文字列変換は new を使わない(JSON)
const obj = { id: 1, name: "Taro" };
const json = JSON.stringify(obj);
const parsed = JSON.parse(json);
console.log(parsed.name); // Taro
- 状態を持たず、変換処理のみを提供
6. 判断基準としての実践的ルール
・データを保持したい → new を検討
・計算や変換だけ → new は不要