Orlok: prototype in JS

Beitrag lesen

Hallo

Ist Prototype nicht mit JS 1.5 aufgekommen oder mit ECMAScript 4?

Nein, mit JS 1.1 im Netscape Navigator 3.

Das betrifft allerdings nur die Eigenschaft prototype von Funktionsobjekten. Das auf Prototypen basierende Vererbungsmodell ansich war bereits in der ersten Version der Sprache implementiert.

Im Übrigen ist es für das Verständnis dieses Modells und damit auch der Sprache als Ganzes durchaus von Bedeutung, zwischen dem Begriff Prototyp und der Eigenschaft prototype zu differenzieren, denn nicht jedes Objekt, das über die Eigenschaft prototype einer Funktion referenziert wird, ist auch tatsächlich der Prototyp eines anderen Objektes. Ebenso gilt, dass nicht jeder Prototyp als Wert einer Funktionseigenschaft namens prototype hinterlegt ist.

Sehen wir uns mal ein Beispiel für den ersten Fall an.

function Constructor ( ) { }

console.log(typeof Constructor.prototype); // object

Hier haben wir eine selbstdefinierte gewöhnliche Funktion, welche standardmäßig über eine eigene Eigenschaft mit dem Namen prototype verfügt, deren Wert ein Objekt ist.

Bei diesem Objekt handelt es sich jedoch nicht um einen Prototypen. Jedenfalls noch nicht. Denn es gibt kein anderes Objekt, das von diesem Objekt erben würde.

Das können wir allerdings ändern, indem wir die zuvor deklarierte Funktion mit dem Operator new als Konstruktor aufrufen, denn bei einem solchen Aufruf wird ein Objekt erzeugt und von der Funktion zurückgegeben, dessen Prototyp das in der Eigenschaft prototype hinterlegte Objekt ist.

const instance = new Constructor;

console.log(typeof instance); // object

console.log(Constructor.prototype.isPrototypeOf(instance)); // true

Hier rufen wir also zunächst unsere zuvor erstellte Funktion als Konstruktor auf und speichern das dabei erzeugte Objekt in der Konstante namens instance.

Eine Referenz auf dieses Objekt übergeben wir dann der Methode isPrototypeOf, die wir auf dem Objekt aufrufen, das in der Eigenschaft prototype der Funktion gespeichert ist. Diese Methode prüft, ob das Objekt auf dem sie aufgerufen wurde ein Prototyp des Objektes ist, das ihr als Argument übergeben wurde.

Da der Prototyp eines durch den Aufruf eines Konstruktors erzeugten Objektes wie gesehen das Objekt ist, das in der Eigenschaft prototype der jeweiligen Funktion hinterlegt ist, fällt das Ergebnis der Überprüfung hier entsprechend positiv aus. Constructor.prototype ist nun also der Prototyp des Objektes instance.

Sehen wir uns jetzt ein Beispiel für den zweiten eingangs beschriebenen Fall an, nämlich einen Prototypen, der nicht der Wert einer Eigenschaft prototype eines Funktionsobjektes ist.

const proto = { };

const object = Object.create(proto);

console.log(Object.getPrototypeOf(object) === proto); // true

Hier erzeugen wir zunächst in Literalschreibweise ein planes Objekt und initialisieren damit eine Konstante namens proto.

Im nächsten Schritt rufen wir die Methode Object.create auf und übergeben dabei eine Referenz auf das zuvor erzeugte Objekt als Argument.

Die Methode Object.create erzeugt nun selbst wiederum ein planes Objekt, dessen Prototyp das Objekt ist, welches ihr als erstes Argument übergeben wurde, hier also das Objekt namens proto. Das auf diese Weise erzeugte Objekt speichern wir in der Konstante namens object.

Schließlich lassen wir uns von der Methode Object.getPrototypeOf eine Referenz auf den Prototypen von object zurückgegeben, welche wir mit einer Referenz auf das Objekt proto vergleichen.

Da beide Referenzen auf dasselbe Objekt zeigen, proto also der Prototyp von object ist, wird im Ergebnis der Wert true in die Konsole geschrieben. Das heißt, wir haben hier mit dem Objekt proto einen Prototypen, der nicht in der Eigenschaft prototype einer Funktion hinterlegt ist.

Es bleibt also festzuhalten, dass in ECMAScript prinzipiell jedes Objekt, gleich welchen Typs, der Prototyp eines anderen Objektes sein kann, und dass dies nicht auf Objekte beschränkt ist, die in der Eigenschaft prototype eines Funktionsobjektes gespeichert sind.


Als weitere Lektüre zu dem Thema würde ich den Artikel zum Thema Vererbung im Wiki empfehlen.

Viele Grüße,

Orlok