Maison  >  Article  >  interface Web  >  Pourquoi une fonction constructeur renvoie-t-elle parfois une valeur autre que celle-ci ?

Pourquoi une fonction constructeur renvoie-t-elle parfois une valeur autre que celle-ci ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-11 12:53:021021parcourir

Why Does a Constructor Function Sometimes Return a Non-this Value?

Le cas curieux des retours non-this dans les fonctions constructeur

Lors de l'appel d'une fonction constructeur avec le nouveau mot-clé, il est généralement supposé que la fonction renverra le nouveau créé objet. Cependant, dans des circonstances spécifiques, une valeur autre que this peut être renvoyée à la place.

En JavaScript, la condition exacte qui régit ce comportement est définie dans la propriété interne [[Construct]] de la spécification ECMAScript pour les objets fonction. Lorsqu'elle est appelée, cette propriété effectue les étapes suivantes :

  1. Crée un nouvel objet.
  2. Définit sa propriété [[Class]] comme "Objet".
  3. Récupère la valeur de la propriété prototype de la fonction constructeur.
    4-5. Définit la propriété [[Prototype]] du nouvel objet sur la valeur du prototype (s'il s'agit d'un objet) ou sur l'objet prototype de l'objet d'origine dans le cas contraire.
  4. Appelle la propriété [[Call]] de la fonction constructeur, en utilisant le nouvel objet comme ceci, en passant les arguments du constructeur comme arguments.
    7-8. Étape cruciale : Renvoie le nouvel objet si Type(Result(6)) n'est pas un objet, ou renvoie Result(1) (c'est-à-dire le nouvel objet créé à l'étape 1) sinon.

Par conséquent, la valeur renvoyée par la fonction constructeur déterminera si l'objet nouvellement créé est renvoyé ou non :

  • Si le la valeur renvoyée est une primitive non-objet, le nouvel objet sera renvoyé.
  • Si la valeur renvoyée est n'importe quel objet, celle-ci sera renvoyée à la place.

Pour tester si l'objet nouvellement créé est vraiment différent de celui renvoyé par le constructeur, on peut vérifier : (new Foo() instanceof Foo) === faux.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn