Pourquoi prototypes initialisés manuellement null encore hériter de l'objet
-
22-10-2019 - |
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: -)
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:
- Soit obj être un objet ECMAScript natif nouvellement créé.
- Définir toutes les méthodes internes de obj comme indiqué dans 8.12.
- Définissez le [[classe]] propriété interne de obj " Objet ".
- Définissez le [[Extensible]] propriété interne de obj true .
- Soit proto être la valeur d'appeler la [[Get]] propriété interne de F avec l'argument " prototype ".
- Si le type ( proto ) est l'objet, définissez la [[Prototype]] propriété interne de obj proto .
- 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.
- 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 .
- Si le type ( Résultat ) est l'objet puis revenez Résultat .
- 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