Question

Si j'écris ceci

var o = Object.create(null)
alert(o instanceof Object) // this is false

Comment se fait cela finit par être vrai

function o() {

}
o.prototype = null
alert(new o() instanceof Object) // this is true

ne doit pas régler manuellement le prototype null amener à hériter de rien comme le fait Object.create. Merci à l'avance: -)

Était-ce utile?

La solution

En bref, si le prototype d'un constructeur est pas un objet, alors les cas sont donnés Object.prototype comme [[prototype]].

Le détail est ECMA-262, §13.2.2 [[Construire]]:

Lorsque le [[Construct]] Méthode interne pour un objet de fonction F est appelée avec une liste peut être vide d'arguments, les étapes suivantes sont prises:

  1. Soit obj être un objet ECMAScript natif nouvellement créé.
  2. Définir toutes les méthodes internes de obj comme indiqué dans 8.12.
  3. Définissez le [[classe]] propriété interne de obj " Objet ".
  4. Définissez le [[Extensible]] propriété interne de obj true .
  5. Soit proto être la valeur d'appeler la [[Get]] propriété interne de F avec l'argument " prototype ".
  6. Si le type ( proto ) est l'objet, définissez la [[Prototype]] propriété interne de obj proto .
  7. Si le type ( proto ) ne sont pas l'objet, définissez la propriété interne [[Prototype]] de obj à la norme intégrée objet objet prototype comme décrit dans 15.2.4.
  8. Soit Résultat soit le résultat de l'appel de la [[Appel]] propriété interne de F , fournissant obj cette valeur et de fournir la liste des arguments passés dans [[Construire]] comme args .
  9. Si le type ( Résultat ) est l'objet puis revenez Résultat .
  10. Retour obj .

Constatant que dans les points 6 et 7, null est nulle de type (ECMA-262 §8.2), il est le même que typeof null, qui est objet .

Autres conseils

Lorsque vous instanciez comme ça, elle retourne un objet de o.

Sa chaîne prototype (caché) toujours à des points Object

Prototype

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top