2017-08-24 1 views
0

Les deux expressions suivantes:isPrototypeOf et __proto__ ont des résultats différents

"abc".__proto__.__proto__ === Object.prototype // true 
Object.prototype.isPrototypeOf("abc")   // false 

La première expression prouve que Object.prototype se trouve dans la chaîne prototype de "abc". Cependant, la deuxième expression obtient un résultat opposé.

Je suis très confus. J'espère que n'importe qui peut expliquer.

Répondre

1

"abc" n'est pas un objet. Lorsque vous évaluez "abc".__proto__, un objet wrapper String est implicitement construit pour récupérer le prototype de, et Object.prototype est dans la chaîne prototype de cet objet wrapper.

Object.prototype.isPrototypeOf("abc") ne construit pas d'objet wrapper. Il regarde seulement "abc", voit que "abc" n'est pas un objet et n'a pas de chaîne de prototype, et retourne false. Vous pouvez le voir dans la ECMAScript spec (version 6):

Lorsque la méthode isPrototypeOf est appelée avec l'argument V, les mesures suivantes sont prises:

  1. Si le type (V) n'est pas l'objet, le retour faux.