# Objektorientierte Programmierung in JavaScript ## Überblick Die objektorientierte Programmierung (OOP) ermöglicht es, Code in wiederverwendbare und strukturierte Einheiten zu organisieren. In JavaScript werden Klassen als Vorlagen für Objekte verwendet. ## Grundkonzepte ### 1. Klassen Definition ```javascript class Person { firstName; lastName; constructor(firstNameX, lastNameX) { this.firstName = firstNameX; this.lastName = lastNameX; } getFullName() { return `${this.firstName} ${this.lastName}`; } } ``` **Wichtige Punkte:** - Klassen sind Vorlagen/Schablonen für Objekte - Properties werden am Anfang der Klasse deklariert - Der `constructor` wird automatisch beim Erstellen einer Instanz aufgerufen - Methoden werden ohne das Schlüsselwort `function` definiert ### 2. Vererbung mit `extends` ```javascript class Contact extends Person { phone; constructor(firstNameX, lastNameX, phoneX) { super(firstNameX, lastNameX); this.phone = phoneX; console.log('new Contact Created!'); } call() { window.location.href = `tel:${this.phone}`; } printFullName() { console.log(`${this.firstName} ${this.lastName}`); } } ``` **Vererbung Konzepte:** - `extends` erbt alle Properties und Methoden der Elternklasse - `super()` ruft den Constructor der Elternklasse auf - Muss als erstes im Constructor der Kindklasse stehen - Kindklassen können eigene Properties und Methoden hinzufügen ### 3. Weitere Vererbungsbeispiele ```javascript class Friend extends Person { constructor(fn, ln) { super(fn, ln); } } ``` **Vereinfachte Vererbung:** - Minimale Implementierung möglich - Erbt automatisch alle Funktionalitäten der Elternklasse ## Praktische Anwendung ### Instanzen erstellen und verwenden ```javascript let contacts = [ new Contact('xTests', 'dissltel', '0123456789'), new Friend('seladts', 'lastname') ]; ``` ### Funktionen für Objekterstellung ```javascript function addContact(firstName, lastName, phone) { let myContact = new Contact(firstName, lastName, phone); contacts.push(myContact); return myContact; } // Verwendung addContact('copy', 'gast', '02384951'); addContact('test', 'past', '02384951'); ``` ## Dateistruktur und Organisation ### HTML Integration ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <script src="classes/person.class.js"></script> <script src="classes/contact.class.js"></script> <script src="classes/friend.class.js"></script> <script src="script.js"></script> </body> </html> ``` **Organisationsstruktur:** - Separate Dateien für jede Klasse - Logische Reihenfolge beim Laden (Elternklasse zuerst) - Hauptscript am Ende ## Objekterstellung Vergleich ### Moderne Klassen-Syntax ```javascript let myContact = new Contact(firstName, lastName, phone); contacts.push(myContact); ``` ### Veraltete Objekt-Notation (nicht empfohlen) ```javascript // JSON = Javascript Object Notation contacts.push({ 'firstName': 'p_none', 'lastName': 'd_none' }); ``` ## Wichtige Unterschiede ### Klassen vs. Objekte - **Klassen**: Vorlagen/Schablonen für Objekte - **Objekte**: Konkrete Instanzen einer Klasse - **Constructor**: Spezielle Methode zur Initialisierung - **Vererbung**: Wiederverwendung von Code durch `extends` ### Syntax-Besonderheiten - Kein `function` Schlüsselwort in Klassen-Methoden - `this` referenziert die aktuelle Instanz - `super()` für Zugriff auf Elternklasse - Properties können vor dem Constructor deklariert werden ## Vorteile der OOP - **Wiederverwendbarkeit**: Code kann in verschiedenen Kontexten genutzt werden - **Struktur**: Klare Organisation des Codes - **Vererbung**: Funktionalitäten können erweitert werden - **Kapselung**: Zusammengehörige Daten und Funktionen sind gruppiert - **Wartbarkeit**: Änderungen sind lokalisiert und kontrolliert