new
new演算子はコンストラクタ関数を持つユーザー定義オブジェクト型のインスタンス、または組み込みのオブジェクト型のインスタンスを作成します。
文法
new constructor[([arguments])]
引数 | 説明 |
---|---|
constructor | オブジェクトインスタンスの型を特定する関数(function)を指定します。 |
arguments |
constructor (コンストラクタ)と一緒に呼び出される値のリストを渡します。
|
説明
ユーザー定義オブジェクトをの作成には、2つの手順を必要とします。
- 関数を書くことで、オブジェクトを定義します。
-
new
を使用して、オブジェクトのインスタンスを作成します。
オブジェクトの型を定義するには、名前とそのプロパティを指定するオブジェクト型のための関数を作成します。 オブジェクトは、自身とは別のオブジェクトをプロパティとして持つことが可能です。 後述する例を参考にしてください。
new foo(...)
のコードが実行されると、次のことが起こります。
-
新しいオブジェクトが作成され、
foo.prototype
を継承します。 -
コンストラクタ関数fooは指定された引数を使用して呼び出され、
thisは新しく作成されたオブジェクトにバインドされます。
new foo
はnew foo()
に相当するもので、 すなわち、引数のリストが指定されず、引数無しでfooが呼び出されることになります。 -
コンストラクタ関数によって返されたオブジェクトが、
new
式の結果になります。 もしコンストラクタ関数が明示的にオブジェクトを返さない(return)場合、 手順1の作成されたオブジェクトが代わりに使用されます。 (通常、コンストラクタは値を返しませんが、通常のオブジェクト作成処理を上書きしたいような場合に、それを選択することが出来ます。)
JavaScriptでは定義されたオブジェクトに対して、いつでもプロパティを追加することが可能です。
例えば、car1.color = "black"
文はcolorプロパティをcar1に追加し、
"black"の値を割り当てています。
ただし、これはその他のオブジェクトには影響を与えません。
同じ型の全てのオブジェクトに新しいプロパティを追加するには、
Car
オブジェクト型の定義へプロパティを追加しなければいけません。
Function.prototypeのプロパティを使用することで、
予め定義されたオブジェクトへ共有プロパティを追加することが可能です。
このプロパティ定義は、オブジェクト型の1インスタンだけのものでは無く、
その関数で作られた全てのオブジェクトで共有されます。
下記のコードは、Car
型の全てのオブジェクトへ、colorプロパティをnull
値で追加し、
次にcar1
インスタンスのプロパティだけを、文字列"black"で上書きしています。
詳細については、prototypeを参照してください。
function Car() {}
car1 = new Car()
alert(car1.color) // undefined
Car.prototype.color = null
alert(car1.color) // null
car1.color = "black"
alert(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;
}
下記のように、新しい2つのperson
オブジェクトをインスタンス化します。
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);
新しいオブジェクトを作成する際に、リテラル文字列または数値を渡す代わりに、
上記の文ではrand
とken
のオブジェクトをownerにパラメーターとして渡しています。
下記のようにプロパティにアクセスすることで、car2のownerの名前を見つける事が出来ます。
car2.owner
仕様
ブラウザ互換性
機能 | Chrome | Firefox (Gecko) |
IE | Opera | Safari |
---|---|---|---|---|---|
基本 | ◯ | ◯ | ◯ | ◯ | ◯ |
機能 | Android | Chrome for Android |
Firefox Mobile |
IE Mobile |
Opera Mobile |
Safari Mobile |
---|---|---|---|---|---|---|
基本 | ◯ | ◯ | ◯ | ◯ | ◯ | ◯ |
関連項目
© 2017 Mozilla Contributors
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
このページは、ページトップのURL先のMozilla Developer Network(以下、MDN)のコンテンツを翻訳した内容を基に構成されています。 構成について異なる点も含まれますので、下記の項目を確認し、必要に応じて元のコンテンツをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。
- 特定のブラウザに特化しすぎている情報やあまりにも古い情報、 または試験的に導入されているようなAPIや機能については、省略していることがあります。
- 例やデモについて、実際にページ内で動作させる関係で一部ソースコードを変更している場合や、 その例で使用しているコンテンツの単語や文章などを日本人向けに変更しいてる場合があります。
- MDNの更新頻度が高いため、元のコンテンツと比べ情報が古くなっている可能性があります。
- "訳注:"などの断わりを入れた上で、日本人向けの情報の追記を行っている事があります。