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.

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

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

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

Spécification État Commentaire
ECMAScript 2015 (6th Edition, ECMA-262)
La définition de 'Built-in Function Objects' dans cette spécification.
Standard Définition initiale.
ECMAScript Latest Draft (ECMA-262)
La définition de 'Built-in Function Objects' dans cette spécification.
Projet  

Compatibilité des navigateurs

Update compatibility data on GitHub
OrdinateurMobileServeur
ChromeEdgeFirefoxInternet ExplorerOperaSafariWebview AndroidChrome pour AndroidEdge MobileFirefox pour AndroidOpera pour AndroidSafari pour iOSSamsung InternetNode.js
Support simpleChrome Support complet 46Edge Support complet OuiFirefox Support complet 41IE Aucun support NonOpera Support complet OuiSafari Support complet OuiWebView Android Support complet 46Chrome Android Support complet 46Edge Mobile Support complet OuiFirefox Android Support complet 41Opera Android Support complet OuiSafari iOS Support complet OuiSamsung Internet Android Support complet 5.0nodejs Support complet 5.0.0

Légende

Support complet  
Support complet
Aucun support  
Aucun support

Voir aussi

Étiquettes et contributeurs liés au document

Contributeurs à cette page : SphinxKnight, blackfox
Dernière mise à jour par : SphinxKnight,