--- title: new.target slug: Web/JavaScript/Reference/Opérateurs/new.target tags: - ECMAScript 2015 - JavaScript - Reference translation_of: Web/JavaScript/Reference/Operators/new.target ---
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 {{jsxref("undefined")}}.
Le code source de cet exemple interactif est disponible dans un dépôt GitHub. Si vous souhaitez contribuez à ces exemples, n'hésitez pas à cloner https://github.com/mdn/interactive-examples et à envoyer une pull request !
new.target
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.
new.target
dans les appels de fonctionUtilisé dans les appels de fonctions « classiques » (autrement dit pour les fonctions qui ne sont pas des constructeurs), new.target
vaut {{jsxref("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"
new.target
dans les constructeursUtilisé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écification | État | Commentaire |
---|---|---|
{{SpecName('ES2015', '#sec-built-in-function-objects', 'Built-in Function Objects')}} | {{Spec2('ES2015')}} | Définition initiale. |
{{SpecName('ESDraft', '#sec-built-in-function-objects', 'Built-in Function Objects')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.operators.new_target")}}