Kurze Antwort: __proto__
ist ein Verweis auf die prototype
Eigenschaft des Konstruktors, der das Objekt erstellt hat.
Objekte in JavaScript
Ein JavaScript-Objekt ist ein integrierter Typ für eine Sammlung von null oder mehr Eigenschaften. Eigenschaften sind Container, die andere Objekte, Grundwerte oder Funktionen enthalten.
Konstruktoren in JavaScript
Funktionen sind reguläre Objekte (die [[Call]]
in ECMA-262-Begriffen implementiert sind) mit der zusätzlichen Fähigkeit, aufrufbar zu sein, spielen jedoch eine andere Rolle in JavaScript: Sie werden zu Konstruktoren ( Fabriken für Objekte), wenn sie über den new
Operator aufgerufen werden . Konstruktoren sind daher ein grobes Analogon zu Klassen in anderen Sprachen.
Jede JavaScript-Funktion ist tatsächlich eine Instanz des Function
integrierten Funktionsobjekts mit einer speziellen Eigenschaft namens, prototype
die zum Implementieren der prototypbasierten Vererbung und der gemeinsamen Eigenschaften verwendet wird. Jedes von einer Konstruktorfunktion erstellte Objekt hat einen impliziten Verweis (als Prototyp oder bezeichnet __proto__
) auf den Wert seines Konstruktors prototype
.
Der Konstruktor prototype
ist eine Art Blaupause zum Erstellen von Objekten, da jedes vom Konstruktor erstellte Objekt einen Verweis auf sein Objekt erbt prototype
.
Die Prototypkette
Ein Objekt gibt seinen Prototyp über die interne Eigenschaft [[Prototype]]
oder an __proto__
. Bei der Prototypbeziehung zwischen zwei Objekten geht es um Vererbung: Jedes Objekt kann ein anderes Objekt als Prototyp haben. Der Prototyp kann der null
Wert sein.
Die durch die __proto__
Eigenschaft verbundene Objektkette wird als Prototypkette bezeichnet . Wenn auf eine Eigenschaft in einem Objekt verwiesen wird, bezieht sich diese Referenz auf die Eigenschaft, die im ersten Objekt in der Prototypenkette gefunden wurde, die eine Eigenschaft dieses Namens enthält. Die Prototypenkette verhält sich wie ein einzelnes Objekt.
Siehe dieses Bild (aus diesem Blog extrahiert ):
Wenn Sie versuchen, auf eine Eigenschaft in einem Objekt zuzugreifen, startet JavaScript die Suche in diesem Objekt und setzt den Prototyp, den Prototyp des Prototyps usw. fort, bis die Eigenschaft gefunden wird oder wenn __proto__
der Wert vorhanden ist null
.
Diese Art der Vererbung unter Verwendung der Prototypenkette wird häufig genannt Delegierung bezeichnet , um Verwechslungen mit anderen Sprachen unter Verwendung der Klassenkette zu vermeiden.
Fast alle Objekte sind Instanzen von Object
, weil Object.prototype
es das letzte in ihrer Prototypenkette ist. Ist Object.prototype
aber keine Instanz vonObject
weil Object.prototype.__proto__
hält den Wert null
.
Sie können auch ein Objekt mit einem erstellen null
Prototyp wie dem folgenden :
var dict = Object.create(null);
Ein solches Objekt ist eine bessere Karte (Wörterbuch) als ein wörtliches Objekt, weshalb dieses Muster manchmal als Diktat bezeichnet wird ( Diktat für Wörterbuch) bezeichnet wird.
Hinweis: wörtliche Objekte erstellt {}
sind Instanzen , Object
da ({}).__proto__
ist ein Verweis auf Object.prototype
.