MB: prototype in JS

Moin community,

Meines wissens kann man ...

  • ...Mit prototypen vererbungen simulieren
  • ...Mit Prototypen Eigenschaften von Objekten erweitert werden

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

  1. 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.

    1. 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

      1. 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