SomeFunction.Prototype.constructor vs someFunction.constructor

Je suis conscient du fait que les fonctions en JavaScript mènent une vie double d'une fonction (en tant que chose de première classe pour créer des instances) et la seconde d'un objet normal.

Mais je suis surpris de voir la sortie de la console suivante.

function A() { console.info("A"); } console.info(A.prototype.constructor === A.constructor); // false 

Je m'attendais à ce qu'il soit vrai car je ne m'attendais pas à la propriété du constructor sur l'objet A car il est propre. Et donc après la recherche de chaîne prototypique, il aurait dû être le même objet que A.prototype.constructor . Où suis-je faux ou quelle pièce est-ce que je manque?

Où suis-je faux ou quelle pièce est-ce que je manque?

Que A ne hérite pas de A.prototype . A est une fonction (constructeur) et hérite de Function.prototype . Faire un console.log(Object.getPrototypeOf(A)) 🙂

De A.prototype seulement les new A instances new A héritent (dont .constructor est A ). Voir aussi __proto__ VS. Prototype en JavaScript .

Cela signifie que les deux versions renvoient des valeurs différentes.

  • Object.prototype.constructor

    Renvoie une référence à la fonction Objet qui a créé le prototype de l'instance. Notez que la valeur de cette propriété est une référence à la fonction elle-même, pas une chaîne contenant le nom de la fonction.

  • Constructeur de fonctions

Le constructeur de fonctions crée un nouvel objet Function. Dans JavaScript, chaque fonction est en fait un objet Function.

Aussi, si vous consolez le code ci-dessus, vous verrez

console.info(A.prototype.constructor); les sorties

 function A() { console.info("A"); } 

console.info(A.constructor); les sorties

 function Function() { [native code] } // both are different.