Get to know MDN better
Cette page a été traduite à partir de l'anglais par la communauté. Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.
Cette fonctionnalité est bien établie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis septembre 2016.
La méthode statique Reflect.construct() agit comme l'opérateur new sous la forme d'une fonction. Elle est équivalente à new cible(...args) et permet d'indiquer une valeur différente pour new.target.
La fonction cible à appeler.
listeArgumentsUn objet semblable à un tableau définissant les arguments à passer à cible lors de l'appel.
nouvelleCible FacultatifLa valeur de l'expression new.target pour cible. cible indique la logique d'initialisation de l'objet, tandis que nouvelleCible.prototype indique le prototype de l'objet construit.
Une nouvelle instance de la cible indiquée, créée en l'appelant comme un constructeur (ou en appelant nouvelleCible si elle est fournie) avec les arguments fournis.
Levée si cible ou nouvelleCible ne sont pas des constructeurs, ou si listeArguments n'est pas un objet.
Reflect.construct() fournit la sémantique réflective d'un appel à un constructeur. Autrement dit, Reflect.construct(cible, listeArguments, nouvelleCible) est sémantiquement équivalent à :
Quand on utilise l'opérateur new, cibleet nouvelleCible sont toujours les mêmes constructeurs. Reflect.construct() permet quant à elle de passer une valeur différente pour new.target. Conceptuellement, nouvelleCible est la fonction sur laquelle new est appelé et nouvelleCible.prototype devient le prototype de l'objet construit, tandis que cible est le constructeur effectivement exécuté pour l'initialisation de l'objet. On peut par exemple avoir une valeur new.target différente du constructeur exécuté pour l'héritage de classe :
Reflect.construct() permet d'invoquer un constructeur avec un nombre variable d'arguments (ce qui est également possible lors d'un appel à un constructeur normal grâce à la syntaxe de décomposition).
Reflect.construct() invoque la méthode interne [[Construct]] de cible.
Si le paramètre nouvelleCible est utilisé, il modifiera la valeur de new.target dans le constructeur. L'objet ainsi construit sera une instance de nouvelleCible, pas de cible.
Il n'y a pas de garantie forte quant à la chaîne de prototypes de l'objet construit, car celle-ci dépend de l'implémentation du constructeur. Par exemple, si le constructeur cible renvoie un objet, c'est cet objet qui sera l'objet construit, quelle que soit la valeur de nouvelleCible. Si cible est un proxy avec une trappe pour construct, ce sera la trappe qui contrôlera complètement le processus de construction.
Pour être tout à fait valide, new.target devrait être une fonction constructrice avec une propriété prototype, mais cette règle n'est pas imposée. Si la valeur de la propriété prototype n'est pas un objet, l'objet initialisé héritera de Object.prototype.
Avant l'apparition de Reflect, on pouvait construire des objets avec une combinaison donnée de consttructeur et de prototype grâce à Object.create().
Toutefois, si les résultats sont identiques, il y a une différence notable. Lorsqu'on utilise Object.create() et Function.prototype.apply(), l'opérateur new.target pointe vers undefined dans la fonction utilisée comme constructeur, car le mot-clé new n'est pas utilisé à la création de l'objet (dans cette situation, c'est la même sémantique que apply() qui s'applique, pas celle de construct(), même si les fonctions normales se comportent presque identiquement).
En revanche, quand on appelle Reflect.construct(), new.target pointe vers la valeur fournie par nouvelleCible si elle indiquée ou vers cible sinon.
| ECMAScript® 2027 Language Specification # sec-reflect.construct |
Activez JavaScript pour afficher ce tableau de compatibilité des navigateurs.
Cette page a été modifiée le 17 févr. 2025 par les contributeur·ice·s du MDN.
Votre modèle pour un internet meilleur.
Visitez la société mère à but non lucratif de Mozilla Corporation, la Fondation Mozilla.
Certaines parties de ce contenu sont protégées par le droit d'auteur ©1998—2026 des contributeurs individuels de mozilla.org. Contenu disponible sous une licence Creative Commons.