new 演算子は、コンストラクタ関数を持ったユーザ定義のオブジェクト型または内蔵オブジェクト型のインスタンスを生成します。

構文

new constructor[([arguments])]

引数

constructor
オブジェクトのインスタンスの型を指定する関数。
arguments
constructor の呼び出しに伴う引数のリスト。

説明

ユーザ定義のオブジェクトを生成するには、2 つのステップが必要です:

  1. 関数を記述して、オブジェクトの型を定義します。
  2. new 演算子を使用して、オブジェクトのインスタンスを生成します。

オブジェクトの型を定義するために、オブジェクトの名称やプロパティを指定する、オブジェクトの型のための関数を作成します。オブジェクトは、別のオブジェクトそのものをプロパティとして持つことができます。後述の例をご覧ください。

コード new Foo(...) を実行すると、以下の処理が行われます:

  1. Foo.prototype を継承する、新しいオブジェクトを生成します。
  2. 指定した引数を伴ってコンストラクタ関数 Foo が呼び出され、this が新たに生成したオブジェクトに紐づけられます。new Foonew Foo() と等価です。すなわち、引数を指定しない場合は Foo が引数なしで呼び出されます。
  3. コンストラクタ関数が返すオブジェクトが、new 式の結果になります。コンストラクタ関数が明示的にオブジェクトを返さない場合は、ステップ 1 で生成したオブジェクトを代わりに使用します。(通常、コンストラクタは値を返しませんが、通常のオブジェクト生成プロセスをオーバーライドしたい場合はそのようにすることができます)

以前生成したオブジェクトに、いつでもプロパティを追加できます。例えば car1.color = "black" という構文は、color プロパティを car1 に追加して、値として "black" を代入します。しかし、これは他のオブジェクトには影響を与えません。同じ型のすべてのオブジェクトに新たなプロパティを追加するには、Car オブジェクト型の定義に対してプロパティを追加しなければなりません。

Function.prototype プロパティを使用して、以前定義したオブジェクトに対して共有のプロパティを追加できます。これはオブジェクト型のあるインスタンスのプロパティではなく、関数を使用して生成したすべてのオブジェクトで共有するプロパティを定義します。以下のコードでは car 型のオブジェクトすべてに対して color プロパティを値 null で定義しています。また、インスタンスオブジェクト car1 の color プロパティに文字列の値 "black" を上書きしています。詳しくは prototype をご覧ください。

function Car() {}
car1 = new Car();
 
console.log(car1.color);    // undefined
 
Car.prototype.color = null;
console.log(car1.color);    // null
 
car1.color = "black";
console.log(car1.color);   // black

オブジェクトの型とオブジェクトのインスタンス

自動車用のオブジェクト型を作成したいとします。このオブジェクト型は car という名前で、make、model、year というプロパティを持たせます。そのために、以下の関数を記述します:

function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}

これで、以下のように mycar という名前のオブジェクトを生成できます:

var mycar = new Car("Eagle", "Talon TSi", 1993);

この構文は mycar を生成して、プロパティに特定の値を代入しています。mycar.make の値は文字列 "Eagle"、mycar.year の値は整数 1993 などとなります。

new を呼び出して、car オブジェクトをいくつも生成できます。例えば:

var kenscar = new Car("Nissan", "300ZX", 1992);

別のオブジェクトそのものであるプロパティ

以下のように、person という名前のオブジェクトを定義します:

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

そして、以下のように person オブジェクトのインスタンスを新たに 2 つ生成します:

var rand = new Person("Rand McNally", 33, "M");
var ken = new Person("Ken Jones", 39, "M");

さらに car の定義を、以下のように person オブジェクトを値としてとる owner プロパティを持つように書き換えます:

function Car(make, model, year, owner) {
  this.make = make;
  this.model = model;
  this.year = year;
  this.owner = owner;
}

新しいオブジェクトを生成するため、以下のように使用します:

var car1 = new Car("Eagle", "Talon TSi", 1993, rand);
var car2 = new Car("Nissan", "300ZX", 1992, ken);

この構文では新しいオブジェクトを生成するときに文字列や整数のリテラル値を渡す代わりに、owner のパラメータとしてオブジェクト randken を渡しています。car2 の所有者名を調べるには、以下のようにしてプロパティにアクセスできます:

car2.owner.name

仕様

仕様書 策定状況 コメント
ECMAScript 2017 Draft (ECMA-262)
The new Operator の定義
ドラフト  
ECMAScript 2015 (6th Edition, ECMA-262)
The new Operator の定義
標準  
ECMAScript 5.1 (ECMA-262)
The new Operator の定義
標準  
ECMAScript 3rd Edition (ECMA-262)
The new Operator の定義
標準  
ECMAScript 1st Edition (ECMA-262)
The new Operator の定義
標準 最初の定義。JavaScript 1.0 で実装。

ブラウザ実装状況

機能 Chrome Firefox (Gecko) Internet Explorer Opera Safari
基本サポート (有) (有) (有) (有) (有)
機能 Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
基本サポート (有) (有) (有) (有) (有) (有)

関連情報

ドキュメントのタグと貢献者

 このページの貢献者: yyss, teoli, ethertank, Potappo
 最終更新者: yyss,