new
演算子は、コンストラクタ関数を持ったユーザ定義のオブジェクト型または内蔵オブジェクト型のインスタンスを生成します。
構文
new constructor[([arguments])]
引数
constructor
- オブジェクトのインスタンスの型を指定する関数。
arguments
constructor
の呼び出しに伴う引数のリスト。
説明
ユーザ定義のオブジェクトを生成するには、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 |
---|---|---|---|---|---|---|
基本サポート | (有) | (有) | (有) | (有) | (有) | (有) |