From 152bdebdcf64e9a9756471fbbec6e871c498e337 Mon Sep 17 00:00:00 2001 From: Masahiro FUJIMOTO Date: Thu, 17 Feb 2022 22:32:28 +0900 Subject: 2022/02/02 時点の英語版に同期 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javascript/reference/operators/new/index.md | 206 ++++++++++----------- 1 file changed, 103 insertions(+), 103 deletions(-) (limited to 'files') diff --git a/files/ja/web/javascript/reference/operators/new/index.md b/files/ja/web/javascript/reference/operators/new/index.md index 3e9267d703..a4112c0b2a 100644 --- a/files/ja/web/javascript/reference/operators/new/index.md +++ b/files/ja/web/javascript/reference/operators/new/index.md @@ -3,179 +3,179 @@ title: new 演算子 slug: Web/JavaScript/Reference/Operators/new tags: - JavaScript - - Left-hand-side expressions - - Operator - - Reference + - 言語機能 - 左辺値式 - 演算子 + - リファレンス +browser-compat: javascript.operators.new translation_of: Web/JavaScript/Reference/Operators/new --- -
{{jsSidebar("Operators")}}
+{{jsSidebar("Operators")}} -

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

+**`new` 演算子**を使用すると、開発者はユーザー定義のオブジェクト型やコンストラクター関数を持つ組み込みオブジェクト型のインスタンスを作成することができます。 -
{{EmbedInteractiveExample("pages/js/expressions-newoperator.html")}}
+{{EmbedInteractiveExample("pages/js/expressions-newoperator.html")}} -

構文

+## 構文 -
new constructor[([arguments])]
+```js +new constructor[([arguments])] +``` -

引数

+### 引数 -
-
constructor
-
オブジェクトインスタンスの型を指定するクラスまたは関数です。
-
+- `constructor` + - : オブジェクトインスタンスの型を指定するクラスまたは関数です。 +- `arguments` + - : `constructor` が呼び出される際の引数のリストです。 -
-
arguments
-
constructor が呼び出される際の引数のリストです。
-
+## 解説 -

解説

+**`new`** 演算子は次のことを行います。 +1. 空のプレーンな JavaScript オブジェクトを生成します。 +2. 新しいオブジェクトにプロパティ (`__proto__`) を追加し、コンストラクター関数のプロトタイプオブジェクトに結びつけます。 -

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

+ > **Note:** コンストラクター関数のプロトタイプに追加されたプロトタイプやオブジェクトは、そのためそのコンストラクター関数で(`new` を使用して)生成されたすべてのインスタンスからアクセスできます。 -
    -
  1. 空白のプレーンな JavaScript オブジェクトを作成します。
  2. -
  3. 他のオブジェクトを親プロトタイプとすることで、新しく作成されたオブジェクトと他のオブジェクトをリンク(コンストラクターを設定)します。 -
  4. -
  5. ステップ 1 で新しく作成されたオブジェクトを this コンテキストとして渡します。
  6. -
  7. 関数がオブジェクトを返さない場合は this を返します。
  8. -
+3. 新しく生成されたオブジェクトインスタンスを `this` コンテキストとして結びつけます。 + (すなわち、コンストラクター関数内の `this` へのすべての参照は、最初のステップで作成されたオブジェクトを参照するようになります。) +4. 関数がオブジェクトを返さない場合は `this` を返します。 -

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

+ユーザー定義のオブジェクトを生成するには、2 つのステップが必要です。 -
    -
  1. 関数を記述して、オブジェクトの型を定義します。
  2. -
  3. new 演算子を使用して、オブジェクトのインスタンスを生成します。
  4. -
+1. オブジェクトの名前とプロパティを指定する関数を書くことで、オブジェクトの型を定義します。 + 例えば、オブジェクト `Foo` を生成するコンストラクター関数は以下のようになります。 -

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

+ ```js + function Foo(bar1, bar2) { + this.bar1 = bar1; + this.bar2 = bar2; + } + ``` -

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

+2. `new` 演算子を使用して、オブジェクトのインスタンスを生成します。 -
    -
  1. Foo.prototype を継承する、新しいオブジェクトを生成します。
  2. -
  3. 指定した引数を伴ってコンストラクター関数 Foo が呼び出され、this が新たに生成したオブジェクトに紐づけられます。new Foonew Foo() と等価です。すなわち、引数を指定しない場合は Foo が引数なしで呼び出されます。
  4. -
  5. コンストラクター関数が返すオブジェクト (null, false, 3.1415 などのプリミティブ型ではないもの) が、new 式の結果になります。コンストラクター関数が明示的にオブジェクトを返さない場合は、ステップ 1 で生成したオブジェクトを代わりに使用します。(通常、コンストラクターは値を返しませんが、通常のオブジェクト生成プロセスをオーバーライドしたい場合はそのようにすることができます。)
  6. -
+ ```js + var myFoo = new Foo('Bar 1', 2021); + ``` -

以前生成したオブジェクトに、いつでもプロパティを追加できます。例えば car1.color = "black" という構文は、color プロパティを car1 に追加して、値として "black" を代入します。しかし、これは他のオブジェクトには影響を与えません。同じ型のすべてのオブジェクトに新たなプロパティを追加するには、Car オブジェクト型の定義に対してプロパティを追加しなければなりません。

+> **Note:** オブジェクトは、別のオブジェクトそのものをプロパティとして持つことができます。後述の例をご覧ください。 -

Function.prototype プロパティを使用して、以前定義したオブジェクトに対して共有のプロパティを追加できます。これはオブジェクト型のあるインスタンスのプロパティではなく、関数を使用して生成したすべてのオブジェクトで共有するプロパティを定義します。以下のコードでは Car 型のオブジェクトすべてに対して color プロパティを値 "original color" で定義しています。また、インスタンスオブジェクト car1 の color プロパティに文字列の値 "black" を上書きしています。詳しくは prototype をご覧ください。

+コード `new Foo(...)` を実行すると、以下の処理が行われます。 -
function Car() {}
+1. `Foo.prototype` を継承する、新しいオブジェクトを生成します。
+2. 指定した引数を伴ってコンストラクター関数 `Foo` が呼び出され、 [`this`](/ja/docs/Web/JavaScript/Reference/Operators/this) が新たに生成したオブジェクトに紐づけられます。`new Foo` は `new Foo()` と等価です。すなわち、引数を指定しない場合は `Foo` が引数なしで呼び出されます。
+3. コンストラクター関数が返すオブジェクト (null, false, 3.1415 などのプリミティブ型ではないもの) が、 `new` 式の結果になります。コンストラクター関数が明示的にオブジェクトを返さない場合は、ステップ 1 で生成したオブジェクトを代わりに使用します(通常、コンストラクターは値を返しませんが、通常のオブジェクト生成プロセスをオーバーライドしたい場合はそのようにすることができます)。
+
+以前生成したオブジェクトに、いつでもプロパティを追加できます。例えば `car1.color = "black"` という構文は、`color` プロパティを `car1` に追加して、値として "`black`" を代入します。
+
+しかし、これは他のオブジェクトには影響を与えません。同じ型のすべてのオブジェクトに新たなプロパティを追加するには、 `Car` オブジェクト型の定義に対してプロパティを追加しなければなりません。
+
+[`Function.prototype`](/ja/docs/Web/JavaScript/Reference/Global_Objects/Function) プロパティを使用して、以前定義したオブジェクトに対して共有のプロパティを追加できます。これはオブジェクト型のあるインスタンスのプロパティではなく、関数を使用して生成したすべてのオブジェクトで共有するプロパティを定義します。以下のコードでは `Car` 型のオブジェクトすべてに対して color プロパティを値 `"original color"` で定義しています。また、インスタンスオブジェクト `car1` の color プロパティに文字列の値 "`black`" を上書きしています。詳しくは[プロトタイプ](/ja/docs/Learn/JavaScript/Objects/Object_prototypes)をご覧ください。
+
+```js
+function Car() {}
 car1 = new Car();
 car2 = new Car();
 
 console.log(car1.color);    // undefined
 
-Car.prototype.color = "original color";
-console.log(car1.color);    // original color
+Car.prototype.color = 'original color';
+console.log(car1.color);    // 'original color'
 
 car1.color = 'black';
-console.log(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
-
+console.log(Object.getPrototypeOf(car1).color); // 'original color' +console.log(Object.getPrototypeOf(car2).color); // 'original color' +console.log(car1.color); // 'black' +console.log(car2.color); // 'original color' +``` -
-

new 演算子を記述しなかった場合、コンストラクターは通常の関数として扱われオブジェクトを作成しません。その際、this の値も異なるものになります。

-
+> **Note:** コンストラクター関数は通常の関数と同様に(つまり `new` 演算子なしで)呼び出すことができますが、この場合、新しいオブジェクトは作成されず、`this` の値も異なります。 -

+## 例 -

オブジェクトの型とオブジェクトのインスタンス

+### オブジェクトの型とオブジェクトのインスタンス -

自動車用のオブジェクト型を作成したいとします。このオブジェクト型は Car という名前で、make、model、year というプロパティを持たせます。そのために、以下の関数を記述します。

+自動車用のオブジェクト型を作成したいとします。このオブジェクト型は `Car` という名前で、make、model、year というプロパティを持たせます。そのために、以下の関数を記述します。 -
function Car(make, model, year) {
+```js
+function Car(make, model, year) {
   this.make = make;
   this.model = model;
   this.year = year;
 }
-
+``` -

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

+これで、以下のようにして `myCar` という名前のオブジェクトを生成できます。 -
var mycar = new Car('Eagle', 'Talon TSi', 1993);
-
+```js +var myCar = new Car('Eagle', 'Talon TSi', 1993); +``` -

この構文は mycar を生成して、プロパティに特定の値を代入しています。mycar.make の値は文字列 "Eagle"、mycar.year の値は整数 1993 などとなります。

+この構文は `myCar` を生成して、プロパティに特定の値を代入しています。`myCar.make` の値は文字列 "Eagle"、`myCar.year` の値は整数 1993 などとなります。 -

new を呼び出して、car オブジェクトをいくつも生成できます。例えば、

+`new` を呼び出して、`car` オブジェクトをいくつも生成できます。例えば、 -
var kenscar = new Car('Nissan', '300ZX', 1992);
-
+```js +var kensCar = new Car('Nissan', '300ZX', 1992); +``` -

それ自身が別のオブジェクトであるプロパティ

+### それ自身が別のオブジェクトであるプロパティ -

以下のように、Person という名前のオブジェクトを定義します:

+以下のように、`Person` という名前のオブジェクトを定義します。 -
function Person(name, age, sex) {
+```js
+function Person(name, age, sex) {
   this.name = name;
   this.age = age;
   this.sex = sex;
 }
-
+``` -

そして、以下のように Person オブジェクトのインスタンスを新たに 2 つ生成します。

+そして、以下のように `Person` オブジェクトのインスタンスを新たに 2 つ生成します。 -
var rand = new Person('Rand McNally', 33, 'M');
+```js
+var rand = new Person('Rand McNally', 33, 'M');
 var ken = new Person('Ken Jones', 39, 'M');
-
+``` -

さらに Car の定義を、以下のように Person オブジェクトを値としてとる owner プロパティを持つように書き換えます:

+さらに `Car` の定義を、以下のように `Person` オブジェクトを値としてとる `owner` プロパティを持つように書き換えます: -
function Car(make, model, year, owner) {
+```js
+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);
+```js
+var car1 = new Car('Eagle', 'Talon TSi', 1993, rand);
 var car2 = new Car('Nissan', '300ZX', 1992, ken);
-
- -

この構文では新しいオブジェクトを生成するときに文字列や整数のリテラル値を渡す代わりに、owner のパラメータとしてオブジェクト randken を渡しています。car2 の所有者名を調べるには、以下のようにしてプロパティにアクセスできます。

- -
car2.owner.name
-
+``` -

仕様

+この構文では新しいオブジェクトを生成するときに文字列や整数のリテラル値を渡す代わりに、owner の引数としてオブジェクト `rand` や `ken` を渡しています。`car2` の所有者名を調べるには、以下のようにしてプロパティにアクセスできます。 - - - - - - - - - - - -
仕様書
{{SpecName('ESDraft', '#sec-new-operator', 'The new Operator')}}
+```js +car2.owner.name +``` -

ブラウザー実装状況

+## 仕様書 +{{Specifications}} +## ブラウザーの互換性 -

{{Compat("javascript.operators.new")}}

+{{Compat}} -

関連情報

+## 関連情報 - +- {{jsxref("Function")}} +- {{jsxref("Reflect.construct()")}} +- {{jsxref("Object")}} -- cgit v1.2.3-54-g00ecf