Frage

Wenn ich das schreibe

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

Wie kommt es, dass das wahr ist

function o() {

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

Sollte den Prototyp nicht manuell auf Null einstellen, um es von nichts zu erben, wie Objekt. Create tut es. Danke im Voraus :-)

War es hilfreich?

Lösung

Kurz gesagt, wenn der Prototyp eines Konstruktors kein Objekt ist, werden Instanzen gegeben Object.Prototyp als ihr [Prototyp]].

Das Detail ist in ECMA-262, §13.2.2 [[Konstrukt]]:

Wenn die interne Methode [[[[Konstrukt]] für ein Funktionsobjekt f mit einer möglicherweise leeren Liste von Argumenten aufgerufen wird, werden die folgenden Schritte unternommen:

  1. Lassen obj Seien Sie ein neu erstelltes natives ECMascript -Objekt.
  2. Stellen Sie alle internen Methoden von fest obj wie in 8.12 angegeben.
  3. Stellen Sie die interne Eigenschaft [[Klasse]] fest von obj zu "Objekt".
  4. Stellen Sie die interne Eigenschaft von [[extensible]] fest von obj zu Stimmt.
  5. Lassen Proto Seien Sie der Wert, die interne Eigenschaft von F mit Argument zu rufen. "Prototyp".
  6. Wenn Typ (Proto) ist Objekt, setzen Sie die interne Eigenschaft [[[Prototyp] objzu Proto.
  7. Wenn Typ (Proto) ist kein Objekt, setzen Sie die interne Eigenschaft [[[Prototyp] obj zum in 15.2.4 beschriebenen Standard-Prototyp-Objekt für eingebaute Objekte.
  8. Lassen Ergebnis das Ergebnis des Aufrufens der internen Eigenschaft von [[Anruf]] sein F, Bereitstellung obj als die Dies Wert und Bereitstellung der Argumentliste, die in [[Konstrukt]] als übergeben wurde Args.
  9. Wenn Typ (Ergebnis) Ist Objekt dann zurück Ergebnis.
  10. Zurückkehren obj.

Bemerken, dass in den Punkten 6 und 7, null ist Typ null (ECMA-262 §8.2), es ist nicht dasselbe wie typeof null, welches ist Objekt.

Andere Tipps

Wenn Sie es so instanziieren, gibt es ein Objekt von zurück o.

Seine (versteckte) Prototyp -Kette still verweist auf Object

Prototype

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top