Objekte
Leider wird es viel zu umständlich und unübersichtlich, wenn wir all unsere Daten in Variablen Speichern möchten.
Weil JavaScript eine objektorientierte Programmiersprache ist, benutzen wir die Objekte für besser Übersichtlichkeit und Wiederverwendbarkeit des Codes. Bei der objektorientierten Programmierung geht es darum, ein Teil des Programms als Objekte zu beschreiben, um so etwas von der Komplexität zu nehmen. Nicht selten werden dafür auch Objekte aus dem echten Leben verwendet. Hiermit möchte ich klar ausdrücken, dass ich keine Werbung für bestimmt Konzerne oder Ähnliches mache, ich verwende diese Daten nur zur Demonstration für die Programmierung mit realistischen Objekten.
Wir erstellen ein Objekt ähnlich wie ein Array.
Zuerst kommt das Schlüsselwort "let
", dann der Name des Objekts, dann das Gleichheitszeichen für die Zuweisung und anstelle der eckigen Klammern wie bei Arrays verwenden wir bei Objekten die geschweiften Klammern.
let auto1 = {
marke: 'VW',
typ: 'Golf',
baujahr: 2014,
farbe: 'Blau',
unfallwagen: 'true'
};
Die geschweiften Klammern schreiben wir mit der Tastenkombination Alt Gr und der Taste 7 bzw. 0 auf der Tastatur oberhalb der Buchstaben. Unser Objekt besteht aus 5 Eigenschaften ("marke", "typ", "baujahr", "farbe" und "unfallwagen"). Das sind also Objekteigenschaften. Jede Eigenschaft steht mit Doppelpunkt getrennt von den Methoden. Die Objektmethoden sind: ("VW", "Golf", "2014", "Blau" und "true"). Das bedeutet, dass wir ein Objekt erstellt haben, welches kurzgesagt ein blauer VW Golf aus dem Jahr 2014 mit einem Unfallschaden ist. Über die Konsole können wir das Objekt aufrufen.
console.log(auto1);
Das gesamte Objekt "auto1" wird in der Konsole ausgegeben. Um gezielt auf eine Objekteigenschaft zuzugreifen, schreiben wir nach dem Objektnamen einen Punkt und darauf die gewünschte Eigenschaft.
console.log(auto1.farbe);
Die Konsole gibt nun die Farbe des Objektes aus.
Objektorientierte Programmierung
Ein Objekt ist eine Sammlung von Eigenschaften.
Eine Eigenschaft ist eine Verbindung von einem Namen und einen Wert. Ein Objekt funktioniert wie eine Zuordnungsliste, die weitere Unterobjekte haben kann. Wir verwenden wieder ein Auto als Beispiel.
let car = {
marke: 'Ford',
typ: 'Focus',
kraftstoff: 'Benzin',
baujahr: 2015,
farbe: 'Silber'
};
Unser Objekt "car" hat die Eigenschaften "marke", "typ", "kraftstoff", "baujahr" und "farbe". Wir können nun wie gewohnt auf die einzelnen Eigenschaften des Objekts zugreifen.
console.log(car.kraftstoff);
Der Wert einer Eigenschaft kann aber auch eine Funktion sein. In diesen Fall wird die Eigenschaft dann Methode genannt.
let car = {
marke: 'Ford',
typ: 'Focus',
kraftstoff: 'Benzin',
baujahr: 2015,
farbe: 'Silber',
zeigeBeschreibung: function () {
console.log(this.marke + ' ' + this.typ + ' in ' + this.farbe);
}
};
Hier haben wir die Methode "zeigeBeschreibung".
Durch das Schlüsselwort "this
" verweisen wir direkt auf das Objekt selber, also auf "car".
Somit hat unser Objekt "car" 5 Eigenschaften und verfügt über eine Methode.
Um die Methode anzuwenden, einfach in der Konsole mit runden Klammerpaar aufrufen.
Eine andere Möglichkeit, Objekte zu erstellen, führt über sogenannte "Konstruktorfunktionen".
Prinzipien der objektorientierten Programmierung
In JavaScript haben wir viel mit Objekten zu tun, das beginnt schon beim DOM Document Objekt Model, darüber hinaus handelt es sich Bei Fehler und Ereignisse auch um Objekte.
Mit Objekten arbeiten bedeutet aber nicht gleich objektorientierte Programmierung. Um objektorientiert zu arbeiten, betrachten wir die folgenden Prinzipien.
Abstraktion
Abstraktes verhalten von Objekten wird in Klassen oder Prototypen zusammengefasst.
Datenkappselung
Eigenschaften und Methoden werden in Form von Klassen oder Prototypen gekapselt und vor dem Zugriff von außen verborgen.
Vererbung
Eigenschaften und Methoden können von einer Klasse an eine andere Klasse oder von einem Objekt (dem Prototyp) an ein anderes Objekt vererbt werden.
Polymorphie
Objekte können abhängig von Ihrer Verwendung unterschiedliche Typen annehmen.
Die Liste kann über Aggregierung, Kopplung, Assoziation, Komposition usw. fortgeführt werden. Aber was genau sind Klassen oder Prototypen?
Klassen, Objektinstanzen und Prototypen
In der objektorientierten Programmierung ist eine Klasse so etwas wie der Bauplan für ein Objekt.
Die Klasse dient sozusagen als Vorlage, aus der einzelne Instanzen (Objektinstanzen) erstellt werden können. Innerhalb der Klasse definiert man die Eigenschaften und Methoden, über die die erstellte Objektinstanz verfügen soll. Die Eigenschaften repräsentieren dabei den Zustand und die Methoden das Verhalten der Objektinstanz. Um einzelne Klassen darzustellen, verwenden viele Entwickler die sogenannten Klassendiagramme, um Objekte darzustellen verwendet man entsprechend Objektdiagramme.
Eine Kombination der beiden Diagramme verdeutlicht den Aufbau und die Funktion. Einmal wird die Klasse Tier dargestellt und direkt dazu die beiden Objektinstanzen der Klasse "hund" und "katze". Bei Klassen steht ganz oben der Name der Klasse, darauf folgt optional der Bereich, in dem Eigenschaften aufgeführt sind. In dem darauf folgenden auch optionalen Bereich werden die Methoden der Klasse aufgelistet. Eigenschaften und Methoden werden dabei mit Namen und Datentyp angegeben. Bei Objekten steht auch der Name ganz oben, gefolgt von einem Doppelpunkt und den Name der Klasse, aus dem das Objekt eine Instanz ist. Nach dem Namen werden die Eigenschaften des Objekts mit entsprechendem Wert ausgelistet. Eine Auflistung von Methoden gibt es bei Objektdiagrammen nicht. JavaScript ist keine klassenbasierte Programmiersprache sowie es zum Beispiel Java wäre. JavaScript ist mehr eine objektbasierte Programmiersprache, weil hier die Objektinstanzen nicht auf Basis der Klassen erstellt werden, sondern auf Basis anderer Objekte. Diese anderen Objekte stellen dann den Prototypen dar. Wegen dieses Prinzips der Prototypen bezeichnet man die Programmierung in JavaScript auch als prototypenbasierte Programmierung oder prototypische Programmierung. Die Art der Objektorientierung hat je nach Programmiersprache unterschiedliche Bezeichnungen, bei einer klassenbasierten Programmierung spricht man von klassenbasierter Objektorientierung und bei objektbasierten bzw. prototypenbasierten Programmen spricht man von prototypischer Objektorientierung. In JavaScript gibt es also keine echten Klassen, auch wenn seit ES6 eine Klassensyntax eingeführt wurde. Damit sollten Klassen und Prototypen geklärt sein.
Prinzip 1: Abstraktes verhalten definieren
Klassen oder Prototypen definieren mehrere Objektinstanzen, die ein ähnliches Verhalten haben oder über ähnliche Zustände verfügen. Daher werden Klassen und Prototypen als Abstrakt bezeichnet. In Klassen und Prototypen wird das abstrakte Verhalten definiert, welches bei allen Objektinstanzen gleich ist. Der konkrete Zustand wird erst in der Objektinstanz definiert.
Prinzip 2: Zustand und Verhalten kapseln
Datenkapselung steht für die Zusammenfassung von Eigenschaften und Methoden zu Klassen bzw. Prototypen. Im Normalfall stellt man die Eigenschaft nur über Methoden zur Verfügung, um einen direkten Zugriff zu verhindern und um dadurch zu sichern, dass ein Objekt nicht in einen unerlaubten Zustand versetzt wird. Erlaubt man den direkten Zugriff auf die Eigenschaften, kann es sein, dass der Eigenschaft "farbe", ein Wert Mustermann zugewiesen wird. Daher arbeiten wir lieber mit der Methode set und get um der Eigenschaft den richtigen Wert zuweisen zu können.
Prinzip 3: Zustand und Verhalten vererben
Unter Polymorphie versteht man kurzgesagt die Fähigkeit von Objekten, sich als anderer Typ auszugeben. Dabei kann von der Klasse "Tier" eine Unterklasse "hamster" alle Eigenschaften von der Klasse "Tier" erhalten und selber eine Klasse mit eigenen Eigenschaften stellen. "hamster" ist die Unterklasse und Tier die Oberklasse. Eine Instanz, die der Klasse "hamster" entspringt, ist somit auch automatische eine Instanz der Klasse "Tier".
Prinzip 4: Verschiedene Typen annehmen
Erwartet als Beispiel eine Funktion ein Objekt vom Typ "Tier", können dann Instanzen vom Typ "Tier" als auch Instanzen vom Typ "hamster" als Argumente übergeben werden. Dabei kann von der Klasse "Tier" eine Unterklasse "hamster" alle Eigenschaften von der Klasse Tier erhalten und selber eine Klasse mit eigenen Eigenschaften stellen. Die Instanzen sind polymorph. Sie können den Typ Tier oder den spezielleren Typ "hamster" annehmen.
Weiteres
JavaScript verhält sich bezüglich der objektorientierten Programmierung nicht so eindeutig, wie es andere Sprachen machen. In JavaScript gibt es mehrere Techniken, wie man objektorientiert programmiert.
- Prototypische Objektorientierung: Zum Einsatz kommen lediglich normale Objekte.
- Pseudoklassische Objektorientierung: Zum Einsatz kommen Konstruktorfunktionen
- Objektorientierung mit Klassensyntax: Syntaktische Vereinfachung der pseudoklassischen Objektorientierung.
Weiter mit Operatoren