new 演算子は、コンストラクタ関数を持ったユーザ定義のオブジェクト型または内蔵オブジェクト型のインスタンスを生成します。
構文
new constructor[([arguments])]
引数
constructor- オブジェクトのインスタンスの型を指定する関数。
argumentsconstructorの呼び出しに伴う引数のリスト。
説明
ユーザ定義のオブジェクトを生成するには、2 つのステップが必要です:
- 関数を記述して、オブジェクトの型を定義します。
new演算子を使用して、オブジェクトのインスタンスを生成します。
オブジェクトの型を定義するために、オブジェクトの名称やプロパティを指定する、オブジェクトの型のための関数を作成します。オブジェクトは、別のオブジェクトそのものをプロパティとして持つことができます。後述の例をご覧ください。
コード new Foo(...) を実行すると、以下の処理が行われます:
Foo.prototypeを継承する、新しいオブジェクトを生成します。- 指定した引数を伴ってコンストラクタ関数
Fooが呼び出され、thisが新たに生成したオブジェクトに紐づけられます。new Fooはnew Foo()と等価です。すなわち、引数を指定しない場合はFooが引数なしで呼び出されます。 - コンストラクタ関数が返すオブジェクトが、
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 のパラメータとしてオブジェクト rand や ken を渡しています。car2 の所有者名を調べるには、以下のようにしてプロパティにアクセスできます:
car2.owner.name
仕様
ブラウザ実装状況
| 機能 | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|
| 基本サポート | (有) | (有) | (有) | (有) | (有) |
| 機能 | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
|---|---|---|---|---|---|---|
| 基本サポート | (有) | (有) | (有) | (有) | (有) | (有) |