prototype in JS
MB
- javascript
Moin community,
Meines wissens kann man ...
Ich will ein Script schreiben in dem man beides nicht braucht. Die Objekte bekommen eine fest anzahl an Instanzvariablen und brauchen keinen zugriff auf andere Objekte in em script den ich schreibe. Inheritance nennt man das?
Ist es denn noch sinvoll Prototypen zu verwenden z.B. performanter usw.? Ich habe noch nie mit Prototypen gearbeitet, weil ich das in dem Bereich in dem ich gearbeitet habe nicht brauchte (Siehe die Punkte oben). Ist das n Fehler?
vlg MB
Tach!
Ist es denn noch sinvoll Prototypen zu verwenden z.B. performanter usw.?
Schau dir mal Typescript an. Das versucht Javascript für C#-Programmierer zu sein. Die Typescript-Webseite hat einen Playground mit ein paar vorgefertigen Beispielen, der dir zeigt, wie bestimmte Konstrukte nach Javascript umgesetzt werden. Daran kannst du sehen, wie man Dinge aus der eher klassischen OOP in der prototypischen Welt von Javascript abbilden kann.
Zur Frage der Performance vermag ich keine detailierte Antwort zu geben. Es gibt ja nicht nur eine Javascript-Engine. Nur soviel: Wenn man nicht exzessiv von etwas Gebrauch macht, kann man die Performance-Frage vernachläsigen und erst dann schauen, wenn spürbar zu langsam ist.
dedlfix.
morgen dedlfix,
werde mir TypeScript ansehen.
Zur Frage der Performance vermag ich keine detailierte Antwort zu geben. Es gibt ja nicht nur eine Javascript-Engine. Nur soviel: Wenn man nicht exzessiv von etwas Gebrauch macht, kann man die Performance-Frage vernachläsigen und erst dann schauen, wenn spürbar zu langsam ist.
Schönen Dank.
Ist Prototype nicht mit JS 1.5 aufgekommen oder mit ECMAScript 4?
mfg MB
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