new

new演算子はコンストラクタ関数を持つユーザー定義オブジェクト型のインスタンス、または組み込みのオブジェクト型のインスタンスを作成します。

文法

new constructor[([arguments])]
引数 説明
constructor オブジェクトインスタンスの型を特定する関数(function)を指定します。
arguments constructor(コンストラクタ)と一緒に呼び出される値のリストを渡します。

説明

ユーザー定義オブジェクトをの作成には、2つの手順を必要とします。

  1. 関数を書くことで、オブジェクトを定義します。
  2. newを使用して、オブジェクトのインスタンスを作成します。

オブジェクトの型を定義するには、名前とそのプロパティを指定するオブジェクト型のための関数を作成します。 オブジェクトは、自身とは別のオブジェクトをプロパティとして持つことが可能です。 後述する例を参考にしてください。

new foo(...)のコードが実行されると、次のことが起こります。

  1. 新しいオブジェクトが作成され、foo.prototypeを継承します。
  2. コンストラクタ関数fooは指定された引数を使用して呼び出され、 thisは新しく作成されたオブジェクトにバインドされます。 new foonew foo()に相当するもので、 すなわち、引数のリストが指定されず、引数無しでfooが呼び出されることになります。
  3. コンストラクタ関数によって返されたオブジェクトが、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);

新しいオブジェクトを作成する際に、リテラル文字列または数値を渡す代わりに、 上記の文ではrandkenのオブジェクトをownerにパラメーターとして渡しています。 下記のようにプロパティにアクセスすることで、car2のownerの名前を見つける事が出来ます。

car2.owner

仕様

ブラウザ互換性

デスクトップ
機能 Chrome Firefox
(Gecko)
IE Opera Safari
基本
モバイル
機能 Android Chrome for
Android
Firefox
Mobile
IE
Mobile
Opera
Mobile
Safari
Mobile
基本

関連項目

 Back to top

© 2017 Mozilla Contributors
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.

このページは、ページトップのURL先のMozilla Developer Network(以下、MDN)のコンテンツを翻訳した内容を基に構成されています。 構成について異なる点も含まれますので、下記の項目を確認し、必要に応じて元のコンテンツをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。

  • 特定のブラウザに特化しすぎている情報やあまりにも古い情報、 または試験的に導入されているようなAPIや機能については、省略していることがあります。
  • 例やデモについて、実際にページ内で動作させる関係で一部ソースコードを変更している場合や、 その例で使用しているコンテンツの単語や文章などを日本人向けに変更しいてる場合があります。
  • MDNの更新頻度が高いため、元のコンテンツと比べ情報が古くなっている可能性があります。
  • "訳注:"などの断わりを入れた上で、日本人向けの情報の追記を行っている事があります。