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: -)

È stato utile?

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:

  1. Let obj essere un oggetto appena creato nativo ECMAScript.
  2. Imposta tutti i metodi interni di obj , come specificato in 8.12.
  3. Imposta il [[Classe]] proprietà interna di obj su " Oggetto ".
  4. Imposta il [[Extensible]] proprietà interna di obj true .
  5. Let proto essere il valore di chiamare la [[Get]] proprietà interna di F con l'argomento " prototipo ".
  6. Se Tipo ( proto ) è oggetto, impostare il [[Prototype]] proprietà interna di obj per proto .
  7. 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.
  8. 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 .
  9. Se Tipo ( risultato ) è oggetto per poi tornare risultato .
  10. 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

Prototipo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top