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
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
:
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 :
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