newキーワードは、JavaScriptでオブジェクトのインスタンスを生成するために使用される重要な演算子です。コンストラクタ関数を呼び出し、新しいオブジェクトを作成します。

主な機能

編集

newキーワードを使用すると、以下のプロセスが実行されます:

  • 新しい空のオブジェクトを作成
  • コンストラクタ関数のthisを新しいオブジェクトにバインド
  • コンストラクタ関数を実行
  • 生成されたオブジェクトを返却(明示的に別のオブジェクトを返さない場合)

基本的な使用例

編集
// コンストラクタ関数の定義
function Person(name, age) {
    this.name = name;
    this.age = age;
}

// newを使用してインスタンス作成
let john = new Person('John Doe', 30);

詳細な動作メカニズム

編集

newキーワードを使用すると、以下のステップが内部的に実行されます:

function newOperator(Constructor, ...args) {
    // 1. 新しいオブジェクトを作成
    const obj = {};

    // 2. プロトタイプをセット
    Object.setPrototypeOf(obj, Constructor.prototype);

    // 3. コンストラクタを実行し、thisをバインド
    const result = Constructor.apply(obj, args);

    // 4. 結果を返却
    return (result && typeof result === 'object') ? result : obj;
}

注意点と制限

編集

アロー関数との非互換性

編集

アロー関数はコンストラクタとして使用できません:

// エラーになります
const Person = (name) => {
    this.name = name; // 期待通りに動作しない
};

プリミティブ値の扱い

編集

プリミティブ値を返すコンストラクタは、オブジェクトを返します:

function StringWrapper(value) {
    return value; // プリミティブ値を返そうとしても
}

let str = new StringWrapper('Hello'); // オブジェクトが返される

高度な使用例

編集

デフォルト値の実装

編集
class User {
    constructor(name = '匿名', age = 0) {
        this.name = name;
        this.age = age;
    }
}

let defaultUser = new User(); // デフォルト値が使用される

プライベートフィールドとの併用

編集
class BankAccount {
    #balance; // プライベートフィールド

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

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

let account = new BankAccount(1000);

関連概念

編集
  • コンストラクタ関数
  • プロトタイプ継承
  • thisキーワード
  • クラス

重要な注意事項

編集
  • newなしでコンストラクタを呼び出すと、予期しない動作やTypeErrorが発生する可能性があります
  • コンストラクタは通常、大文字で始まる命名規則に従います