A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://developer.cdn.mozilla.net/ja/docs/Web/JavaScript/Reference/Operators/new.target below:

new.target - JavaScript | MDN

new.target

Baseline Widely available

new.target は擬似プロパティで、関数やコンストラクターが new 演算子を使用して呼び出されたかどうかを検出することができます。 new 演算子を使用して呼び出されたコンストラクターや関数の中では、 new.target はコンストラクターや関数への参照を返します。通常の関数呼び出しの場合、 new.target は undefined になります。

試してみましょう
function Foo() {
  if (!new.target) {
    throw new TypeError("calling Foo constructor without new is invalid");
  }
}

try {
  Foo();
} catch (e) {
  console.log(e);
  // Expected output: TypeError: calling Foo constructor without new is invalid
}
構文 解説

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

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

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

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

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

例 関数呼び出しにおける new.target の使用

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

function Foo() {
  if (!new.target) {
    throw "Foo() must be called with new";
  }
  console.log("Foo instantiated with new");
}

new Foo(); // "Foo instantiated with new" を出力
Foo(); // "Foo() must be called with new" 例外が発生
コンストラクターにおける new.target

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

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();}}

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

仕様書 ブラウザーの互換性 関連情報

RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4