Warum Prototypen, die manuell auf Null initialisierten, immer noch vom Objekt erben
-
22-10-2019 - |
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 :-)
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:
- Lassen obj Seien Sie ein neu erstelltes natives ECMascript -Objekt.
- Stellen Sie alle internen Methoden von fest obj wie in 8.12 angegeben.
- Stellen Sie die interne Eigenschaft [[Klasse]] fest von obj zu "Objekt".
- Stellen Sie die interne Eigenschaft von [[extensible]] fest von obj zu Stimmt.
- Lassen Proto Seien Sie der Wert, die interne Eigenschaft von F mit Argument zu rufen. "Prototyp".
- Wenn Typ (Proto) ist Objekt, setzen Sie die interne Eigenschaft [[[Prototyp] objzu Proto.
- 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.
- 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.
- Wenn Typ (Ergebnis) Ist Objekt dann zurück Ergebnis.
- 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