new 演算子

new 演算子は、コンストラクター関数を持ったユーザー定義のオブジェクトまたは組込みオブジェクトのインスタンスを生成します。 new のキーワードは以下のことを行います。

  1. 空の JavaScript オブジェクトを生成する
  2. このオブジェクト (のコンストラクター) を他のオブジェクトへリンクする
  3. ステップ 1 で新しく生成されたオブジェクトを this コンテキストとして渡す
  4. 関数が自分自身を返さない場合は this を返す

構文

new constructor[([arguments])]

引数

constructor
オブジェクトインスタンスの型を指定するクラスまたは関数です。
arguments
constructor が呼び出される際の引数のリストです。

解説

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

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

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

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

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

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

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

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

console.log(car1.__proto__.color) //original color
console.log(car2.__proto__.color) //original color
console.log(car1.color)  // black
console.log(car2.color) // original color

new 演算子を記述しなかった場合、コンストラクターは通常の関数として扱われオブジェクトを作成しません。その際、 this の値も異なるものになります。

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

自動車用のオブジェクト型を作成したいとします。このオブジェクト型は 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 Latest 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 で実装。

ブラウザーの互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
newChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 3Opera 完全対応 ありSafari 完全対応 ありWebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 ありSafari iOS 完全対応 ありSamsung Internet Android 完全対応 1.0nodejs 完全対応 あり

凡例

完全対応  
完全対応

関連情報