Perché prototipi inizializzati manualmente per nulla ancora ereditare da Object
-
22-10-2019 - |
Domanda
Se scrivo questo
var o = Object.create(null)
alert(o instanceof Object) // this is false
Come mai questo finisce per essere vera
function o() {
}
o.prototype = null
alert(new o() instanceof Object) // this is true
non deve impostare manualmente il prototipo per nulla perchè è di ereditare dal nulla come fa Object.create. Grazie in anticipo: -)
Soluzione
In breve, se il prototipo di un costruttore non è un oggetto, quindi le istanze sono dati Object.prototype come loro [[prototype]].
Il dettaglio è ECMA-262, §13.2.2 [[Costrutto]]:
Quando la [[Construct]] metodo interno per un oggetto funzione F viene chiamato con una lista vuota di argomenti, sono prese le seguenti operazioni:
- Let obj essere un oggetto appena creato nativo ECMAScript.
- Imposta tutti i metodi interni di obj , come specificato in 8.12.
- Imposta il [[Classe]] proprietà interna di obj su " Oggetto ".
- Imposta il [[Extensible]] proprietà interna di obj true .
- Let proto essere il valore di chiamare la [[Get]] proprietà interna di F con l'argomento " prototipo ".
- Se Tipo ( proto ) è oggetto, impostare il [[Prototype]] proprietà interna di obj per proto .
- Se Tipo ( proto ) non è oggetto, impostare il [[Prototype]] proprietà interna di obj la norma oggetto built-in prototipo oggetto come descritto in 15.2.4.
- Let risultato essere il risultato della chiamata al [[Chiamata]] proprietà interna di F , fornendo obj come questo Valore e fornendo la lista degli argomenti passati in [[costruire]] come args .
- Se Tipo ( risultato ) è oggetto per poi tornare risultato .
- Return obj .
Notando che ai punti 6 e 7, è null
Tipo nullo (ECMA-262 §8.2), non è la stessa typeof null
, che è oggetto .
Altri suggerimenti
Quando si crea un'istanza così, restituisce un oggetto di o
.
La sua (nascosta) prototipo catena di ancora punti a Object