From 33058f2b292b3a581333bdfb21b8f671898c5060 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:40:17 -0500 Subject: initial commit --- .../reference/operators/new.target/index.html | 113 +++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 files/ja/web/javascript/reference/operators/new.target/index.html (limited to 'files/ja/web/javascript/reference/operators/new.target/index.html') diff --git a/files/ja/web/javascript/reference/operators/new.target/index.html b/files/ja/web/javascript/reference/operators/new.target/index.html new file mode 100644 index 0000000000..b00f08cb4e --- /dev/null +++ b/files/ja/web/javascript/reference/operators/new.target/index.html @@ -0,0 +1,113 @@ +--- +title: new.target +slug: Web/JavaScript/Reference/Operators/new.target +tags: + - Classes + - ECMAScript 2015 + - JavaScript + - Language feature + - Reference +translation_of: Web/JavaScript/Reference/Operators/new.target +--- +
{{JSSidebar("Operators")}}
+ +

new.target プロパティを使用すると、関数やコンストラクタが new 演算子を使用して呼び出されたかどうかを検出できます。コンストラクタや関数内で、new 演算子でインスタンス生成すると、new.target はコンストラクタや関数への参照を返します。通常の関数呼び出しの場合、new.target は {{jsxref("undefined")}} です。

+ +
{{EmbedInteractiveExample("pages/js/expressions-newtarget.html")}}
+ + + +

構文

+ +
new.target
+ +

概要

+ +

new.target の構文は、new キーワードとドット、プロパティ名 target で構成されています。通常、ドットの左側はプロパティアクセスが行われるオブジェクトですが、ここでの new はオブジェクトではありません。

+ +

new.target プロパティは、すべての関数で使用できる疑似的なプロパティです。

+ +

クラスのコンストラクタでは、構築されたクラスを参照します。

+ +

通常の関数では、new 演算子を介して呼び出されたと仮定して、関数自体を参照します。それ以外の場合、new.target は {{jsxref("undefined")}} です。

+ +

アロー関数では、new.target は周囲のスコープから継承されます。

+ +

+ +

関数呼び出しにおいての new.target の使用

+ +

通常の関数呼び出しでは(コンストラクタ関数の呼び出しとは反対に)、new.target は {{jsxref("undefined")}} です。これにより、関数がコンストラクタとして new で呼び出されたかを検出できます。

+ +
function Foo() {
+  if (!new.target) { throw 'Foo() must be called with new' }
+  console.log('Foo instantiated with new')
+}
+
+new Foo()  // logs "Foo instantiated with new"
+Foo()      // throws "Foo() must be called with new"
+
+ +

コンストラクタにおいての new.target

+ +

クラスコンストラクタで、new.targetnew で直接実行されたコンストラクタを参照します。これは、コンストラクタは親クラスにあり、子コンストラクタからデリゲートされた場合も同様です。

+ +
class A {
+  constructor() {
+    console.log(new.target.name)
+  }
+}
+
+class B extends A { constructor() { super() } }
+
+let a = new A()  // logs "A"
+let b = new B()  // logs "B"
+
+class C { constructor() { console.log(new.target)  } }
+class D extends C { constructor() { super()  } }
+
+let c = new C()  // logs class C{constructor(){console.log(new.target);}}
+let d = new D()  // logs class D extends C{constructor(){super();}}
+ +

上記のクラス CD の例から、new.target は初期化されたクラスのクラス定義を指しているように見えます。たとえば、dnew D() で初期化した場合は、D のクラス定義が出力され、同様に c の場合は C のクラスが出力されます。

+ +

仕様

+ + + + + + + + + + +
仕様書
{{SpecName('ESDraft', '#sec-built-in-function-objects', 'Built-in Function Objects')}}
+ +

仕様

+ + + + + + + + + + +
仕様書
{{SpecName('ESDraft', '#sec-built-in-function-objects', 'Built-in Function Objects')}}
+ +

ブラウザー実装状況

+ + + +

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

+ +

関連情報

+ + -- cgit v1.2.3-54-g00ecf