--- title: new 演算子 slug: Web/JavaScript/Reference/Operators/new tags: - JavaScript - Left-hand-side expressions - Operator - Reference - 左辺値式 - 演算子 translation_of: Web/JavaScript/Reference/Operators/new ---
new
演算子を使用すると、開発者はユーザー定義のオブジェクト型やコンストラクタ関数を持つ組み込みオブジェクト型のインスタンスを作成することができます。
new constructor[([arguments])]
constructor
arguments
constructor
が呼び出される際の引数のリストです。new
演算子は次のことを行います。
this
コンテキストとして渡します。this
を返します。ユーザー定義のオブジェクトを生成するには、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 プロパティを値 "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 のパラメータとしてオブジェクト rand
や ken
を渡しています。car2
の所有者名を調べるには、以下のようにしてプロパティにアクセスできます。
car2.owner.name
仕様書 |
---|
{{SpecName('ESDraft', '#sec-new-operator', 'The new Operator')}} |
{{Compat("javascript.operators.new")}}