JavaScript

new演算子

 編集:2022.08.07 by T.A.

開発者はユーザー定義のオブジェクト型やコンストラクタ関数を持つ組み込みオブジェクト型のインスタンスを作成することができます。

new constructor[([arguments])]
constructor オブジェクト インスタンスの型を指定するクラス名または関数名です。
arguments constructor が呼び出される際の引数のリストです(カンマで区切る)。

new 演算子は次のことを行います:

  1. 空白のプレーンな JavaScript オブジェクトを作成します。
  2. 他のオブジェクトを親プロトタイプとすることで、新しく作成されたオブジェクトと他のオブジェクトをリンク(コンストラクターを設定)します。
  3. ステップ 1 で新しく作成されたオブジェクトを this コンテキストとして渡します。
  4. 関数がオブジェクトを返さない場合は this を返します。

ユーザー定義のオブジェクトを生成するには、2 つのステップが必要です:

  1. 関数を記述して、オブジェクトの型を定義します。
  2. new 演算子を使用して、オブジェクトのインスタンスを生成します。

オブジェクトの型を定義するために、オブジェクトの名称やプロパティを指定する、オブジェクトの型のための関数を作成します。オブジェクトは、別のオブジェクトそのものをプロパティとして持つことができます。後述の例をご覧ください。

コード「new Foo(...)」を実行すると、以下の処理が行われます:

  1. Foo.prototype を継承する、新しいオブジェクトを生成します。
  2. 指定した引数を伴ってコンストラクター関数 Foo が呼び出され、this が新たに生成したオブジェクトに紐づけられます。「new Foo」は「new Foo()」と等価です。すなわち、引数を指定しない場合は Foo が引数なしで呼び出されます。
  3. コンストラクター関数が返すオブジェクト(null、false、3.1415 などのプリミティブ型ではないもの) が、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 の値も異なるものになります。

function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}

これで、以下のように mycar という名前のオブジェクトを生成できます。

var mycar = new Car('Eagle', 'Talon TSi', 1993);
class Sqr{
  constructor(P1, P2) {
    this.area = P1 * P2;
  }
}
D=new Sqr(10, 20);

テスト