new.target

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since March 2016.

La syntaxe new.target est disponible dans toutes les fonctions et permet entre autres de tester si une fonction ou un constructeur a été appelé avec new. Dans les constructeurs, il fait référence au constructeur invoqué par new. Dans les appels de fonction « normaux », new.target vaut undefined.

Exemple interactif

Syntaxe

js
new.target;

Description

La syntaxe new.target se compose du mot-clé new, suivi d'un point puis d'un nom de propriété (ici target). Généralement et par ailleurs, new. est utilisé comme contexte pour accéder à une propriété. Ici, new. ne fait pas réellement référence à un objet. Dans les appels de constructeurs, new.target fait référence au constructeur qui a été appelé par new. Cette syntaxe permet donc de récupérer cette valeur.

new.target est une méta-propriété, disponible pour toutes les fonctions. Dans les fonctions fléchées, new.target fait référence au new.target de la fonction englobante.

Exemples

Utilisation de new.target dans les appels de fonction

Utilisé dans les appels de fonctions « classiques » (autrement dit pour les fonctions qui ne sont pas des constructeurs), new.target vaut undefined. Cela permet de détecter si une fonction a été appelée comme constructeur avec new :

js
function Toto() {
  if (!new.target) throw "Toto() doit être appelé avec new";
  console.log("Toto instancié avec new");
}

new Toto(); // affiche "Toto instancié avec new" dans la console
Toto(); // lève l'exception avec "Toto doit être appelé avec new"

Utilisation de new.target dans les constructeurs

Utilisés dans les appels de constructeurs de classe, new.target fait référence au constructeur utilisé directement avec new. C'est également le cas quand le constructeur est présent dans une classe parente et est délégué depuis le constructeur fils :

js
class A {
  constructor() {
    console.log(new.target.name);
  }
}

class B extends A {
  constructor() {
    super();
  }
}

var a = new A(); // affiche "A"
var b = new B(); // affiche "B"

class C {
  constructor() {
    console.log(new.target);
  }
}

class D extends C {
  constructor() {
    super();
  }
}

var c = new C(); // function C()
var d = new D(); // function D()

Spécifications

Specification
ECMAScript Language Specification
# sec-built-in-function-objects

Compatibilité des navigateurs

BCD tables only load in the browser

Voir aussi