Vorlesung 4
JavaScript Objekte

Objekte in JavaScript

Objekte sind eine der grundlegendsten Datenstrukturen in JavaScript und spielen eine wichtige Rolle bei der Organisation von Daten und Funktionalität in einer Anwendung.

Was ist ein Objekt in JavaScript?

Ein Objekt in JavaScript ist eine Sammlung von Schlüssel-Wert-Paaren, wobei die Werte beliebige Datentypen sein können, einschließlich Zahlen, Zeichenketten, Funktionen, anderen Objekten und mehr. Objekte werden verwendet, um Daten zu gruppieren und zu organisieren. Jedes Objekt hat eine eindeutige Identität und kann über seine Eigenschaften (Schlüssel) und Methoden (Funktionen) verändert und abgerufen werden.

Erstellen eines Objektes

In JavaScript gibt es mehrere Möglichkeiten, ein Objekt zu erstellen:

Objektliteral

Das gebräuchlichste und einfachste Verfahren. Ein Objekt wird durch geschweifte Klammern erstellt, wobei die Schlüssel-Wert-Paare durch Doppelpunken : getrennt werden.


const person = {
    name: 'Alice',
    age: 30,
    sayHello: function() {
        console.log('Hallo!');
    }
};
                    

Konstruktorfunktion

Sie können auch Objekte mithilfe von Konstruktorfunktionen erstellen. Konstruktorfunktionen sind Funktionen, die mit dem new-Operator aufgerufen werden.


function Person(name, age) {
    this.name = name;
    this.age = age;
    this.sayHello = function() {
        console.log("Hallo!");
    };
}

const person = new Person("Alice", 30);
                

Object-Konstruktor

Sie können ein leeres Objekt mit dem Object-Konstruktor erstellen und dann Eigenschaften und Methoden hinzufügen.


const person = new Object();
person.name = 'Alice';
person.age = 30;
person.sayHello = function() {
    console.log('Hallo!');
};
                

Eigenschaften und Methoden

Eigenschaften: Ein Objekt kann Eigenschaften (Schlüssel) haben, die Werte speichern. Auf Eigenschaften kann mit der Punktnotation oder der Klammernotation zugegriffen werden.


console.log(person.name); // Zugriff mit Punktnotation
console.log(person['age']); // Zugriff mit Klammernotation
                

Methoden: Ein Objekt kann auch Methoden haben, die Funktionen sind, die in einem Objekt gespeichert sind. Diese können aufgerufen werden.

                    
person.sayHello(); // Aufruf einer Methode
                

Verändern von Objekten:

Hinzufügen einer Eigenschaft


person.email = '[email protected]';
                

Ändern einer Eigenschaft


person.age = 31;
                    

Löschen einer Eigenschaft


delete person.age;
                

Iterieren über Objekte

Sie können über die Schlüssel-Wert-Paare eines Objekts iterieren, um auf die darin enthaltenen Daten zuzugreifen.


for (const key in person) {
    console.log(key + ': ' + person[key]);
}    
                

Verwendung von Objekten

Objekte werden in JavaScript häufig verwendet, um Daten zu strukturieren und zu organisieren. Sie sind auch die Grundlage für viele JavaScript-Bibliotheken und Frameworks. Sie können verwendet werden, um:

  • Datenstrukturen zu erstellen und zu verwalten.
  • Funktionen und Methoden zu gruppieren.
  • Klassen und Konstruktorfunktionen zu definieren.
  • SON (JavaScript Object Notation) zu erstellen und zu parsen.
  • Daten für APIs und Serveranfragen zu formatieren.

JSON

JSON (JavaScript Object Notation) ist ein leichtgewichtiges Datenaustauschformat, das in der Webentwicklung weit verbreitet ist. Es ist eine Textnotation zur Darstellung strukturierter Daten, die sowohl von Menschen leicht lesbar als auch von Maschinen leicht analysierbar ist.

Was ist JSON?

  • JSON ist ein Datenaustauschformat: Es dient dazu, Daten zwischen einem Server und einem Client, zwischen verschiedenen Teilen einer Anwendung oder zwischen verschiedenen Anwendungen auszutauschen.
  • JSON ist textbasiert: JSON-Daten werden als Zeichenketten (Strings) dargestellt und sind somit in menschenlesbarer Form.
  • JSON ist unabhängig von Programmiersprachen: JSON kann von vielen Programmiersprachen gelesen und generiert werden. Es ist nicht auf JavaScript beschränkt, obwohl es in JavaScript seinen Ursprung hat.

JSON Struktur

JSON-Daten bestehen aus einer oder mehreren Paaren von Schlüsseln und Werten. Jedes Paar wird durch einen Doppelpunkt getrennt, und die Paare werden durch Kommas voneinander getrennt.

Unterstützte Datentypen

Objekte: Objekte werden in geschweiften Klammern dargestellt und enthalten Schlüssel-Wert-Paare.


{
    "name": "Alice",
    "age": 30,
    "city": "New York"
}
                

Arrays: Arrays werden in eckigen Klammern [] dargestellt und enthalten eine geordnete Liste von Werten


[
    "Apple",
    "Banana",
    "Cherry"
]
                

Strings: Zeichenketten werden in doppelten Anführungszeichen " " dargestellt.


"Hello, World!"
                

Zahlen: Zahlen können als Ganzzahlen oder Fließkommazahlen dargestellt werden.


42
3.14
                

Boolesche Werte: true und false repräsentieren boolesche Werte.


true
false
                

Null: null repräsentiert den Wert "keine Daten".


null
                

Verwendung von JSON

JSON wird in verschiedenen Kontexten verwendet

  • Datenübertragung: JSON wird häufig verwendet, um Daten zwischen einem Server und einem Client auszutauschen. Dies geschieht oft bei APIs (Application Programming Interfaces), bei denen Serverdaten in JSON-Format an den Client gesendet und von diesem interpretiert werden.
  • Konfigurationsdateien: JSON wird zur Speicherung von Konfigurationsdaten in Anwendungen verwendet. Dies ermöglicht es, Einstellungen und Parameter in einer gut strukturierten Form zu speichern.
  • Datenbanken: Einige NoSQL-Datenbanken verwenden JSON als internes Format für die Speicherung von Daten.
  • JvaScript-Objekte: JSON und JavaScript-Objekte sind eng miteinander verwandt. JSON-Daten können leicht in JavaScript-Objekte umgewandelt werden und umgekehrt.
  • 
        // JSON zu JavaScript-Objekt
        const jsonData = '{"name": "Alice", "age": 30}';
        const jsObject = JSON.parse(jsonData);
    
        // JavaScript-Objekt zu JSON
        const person = { name: 'Bob', age: 25 };
        const jsonString = JSON.stringify(person);
                        

JSON ist ein flexibles und weit verbreitetes Format, das dazu beiträgt, Daten in strukturierter und lesbare Form zu organisieren und auszutauschen. Es ist ein wichtiger Bestandteil der modernen Webentwicklung und ermöglicht die Integration von verschiedenen Teilen einer Anwendung oder verschiedenen Anwendungen selbst.

JavaScript Klassen

In JavaScript sind Klassen eine Möglichkeit, objektorientierte Programmierung (OOP) zu implementieren. Sie bieten eine Möglichkeit zur Definition von Blueprints für Objekte und zur Erstellung von Instanzen dieser Objekte.

Was sind Klassen in JavaScript?

Klassen sind Baupläne: Klassen dienen als Baupläne oder Vorlagen für die Erstellung von Objekten. Sie definieren die Struktur und das Verhalten von Objekten, die auf Basis dieser Klasse erstellt werden.

Instanzen von Klassen: Wenn Sie eine Klasse erstellen, können Sie beliebig viele Instanzen (Objekte) dieser Klasse erstellen. Jede Instanz hat ihre eigenen Eigenschaften und kann ihre eigenen Methoden aufrufen.

Konstruktor: Eine Klasse enthält normalerweise einen Konstruktor, der beim Erstellen einer Instanz aufgerufen wird. Der Konstruktor initialisiert die Eigenschaften des Objekts.

Methoden: Klassen können Methoden enthalten, die Funktionen darstellen, die von den Instanzen der Klasse aufgerufen werden können.

Vererbung: JavaScript unterstützt die Vererbung, was bedeutet, dass Sie eine neue Klasse erstellen können, die von einer bestehenden Klasse erbt. Die abgeleitete Klasse erbt Eigenschaften und Methoden von der Basisklasse.

Hier ist ein einfaches Beispiel für eine Klasse in JavaScript


class Person {
    // Konstruktor
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    // Methode
    sayHello() {
        console.log("Hallo, mein Name ist "$"{this.name} und ich bin "$"{this.age} Jahre alt.");
    }
}

// Instanz erstellen
const person1 = new Person('Alice', 30);

// Methode aufrufen
person1.sayHello(); // Ausgabe: Hallo, mein Name ist Alice und ich bin 30 Jahre alt.        
                

In diesem Beispiel haben wir eine Klasse Person erstellt, die einen Konstruktor für die Initialisierung von name und age enthält. Die Methode sayHello gibt eine Begrüßungsnachricht aus.

Hier ist ein Beispiel für Vererbung von Klassen in JavaScript


class Animal {
    constructor(name) {
        this.name = name;
    }

    speak() {
        console.log(""$""{this.name} macht Geräusche.");
    }
}

class Dog extends Animal {
    constructor(name, breed) {
        super(name); // Aufruf des Konstruktors der Elternklasse
        this.breed = breed;
    }

    speak() {
        console.log(""$"{this.name} (Rasse: "$"{this.breed}) bellt.");
    }
}

const dog1 = new Dog('Buddy', 'Golden Retriever');
dog1.speak(); // Ausgabe: Buddy (Rasse: Golden Retriever) bellt.        
                

In diesem Beispiel haben wir eine Basisklasse Animal und eine abgeleitete Klasse Dog. Die abgeleitete Klasse erbt die Eigenschaft name von der Basisklasse und überschreibt die Methode speak mit einer spezifischen Implementierung.


Klassen bieten eine strukturierte Möglichkeit, OOP in JavaScript zu verwenden, und erleichtern die Organisation und den Wiederverwendbarkeit von Code. Sie sind eine wichtige Funktion in modernen JavaScript-Anwendungen.

Kapselung in JavaScript-Klassen

Kapselung bezieht sich auf die Praxis, Daten und Methoden in einer Klasse so zu organisieren, dass sie von außerhalb der Klasse nicht direkt zugegriffen werden können. In JavaScript ist Kapselung nicht so streng wie in einigen anderen objektorientierten Sprachen wie Java oder C++, aber Sie können dennoch einige Maßnahmen ergreifen, um den Zugriff auf Daten zu beschränken.

Private Eigenschaften und Methoden

JavaScript unterstützt keine echten privaten Eigenschaften und Methoden. Stattdessen können Sie Konventionen verwenden, um anzugeben, dass eine Eigenschaft oder Methode als privat betrachtet werden sollte, und auf sie nur über öffentliche Schnittstellen zugreifen.


class Person {
    constructor(name) {
        this._name = name; // Konvention: _name als privat markiert
    }

    getName() {
        return this._name; // Öffentliche Methode zum Zugriff auf _name
    }
}    
            

chwaches Privatsphäre-Muster (Weak Privacy Pattern)

Sie können auch das schwache Privatsphäre-Muster verwenden, indem Sie WeakMap verwenden, um private Eigenschaften zu speichern. Dies bietet eine gewisse Privatsphäre, da außerhalb der Klasse nicht auf diese Eigenschaften zugegriffen werden kann.


const privateData = new WeakMap();

class Person {
    constructor(name) {
        privateData.set(this, { name }); // Private Daten in WeakMap speichern
    }

    getName() {
        return privateData.get(this).name; // Privates Datum abrufen
    }
}
            

this

Das Schlüsselwort "this" in JavaScript bezieht sich auf das aktuelle Objekt, auf das in einer Methode oder einem Konstruktor zugegriffen wird. Das Verständnis von "this" ist wichtig, da es den Kontext bestimmt, in dem eine Methode ausgeführt wird.

Globaler Kontext

In einem globalen Kontext bezieht sich "this" auf das globale Objekt, das im Browser normalerweise "window" ist.

Funktionskontext

In einer regulären Funktion bezieht sich "this" auf das aufrufende Objekt. In Arrow-Funktionen wird "this" von der umgebenden Funktion ererbt.

Konstruktor

In einem Konstruktor bezieht sich "this" auf die Instanz des Objekts, das gerade erstellt wird.

"bind"-Methode in JavaScript

Die "bind"-Methode ermöglicht es, die "this"-Bindung für eine Funktion explizit festzulegen. Dies ist nützlich, wenn Sie sicherstellen möchten, dass "this" in einer Funktion auf ein bestimmtes Objekt zeigt.


class Counter {
    constructor() {
        this.count = 0;
        this.increment = this.increment.bind(this);
    }

    increment() {
        this.count++;
        console.log(this.count);
    }
}

const counter = new Counter();
const incrementFunction = counter.increment;

incrementFunction(); // Fehler, da "this" nicht auf das Counter-Objekt zeigt

const boundIncrement = counter.increment;
boundIncrement(); // Funktioniert, da "this" gebunden wurde   
            

Private Klassendaten (Private Fields)

JavaScript bietet eine Möglichkeit, private Eigenschaften und Methoden in Klassen zu definieren, indem "#" vor dem Eigenschaftsnamen oder Methodennamen platziert wird. Dies ist eine modernere Möglichkeit, die Privatsphäre in Klassen zu gewährleisten.


class Person {
    #name = "Alice"; // Private Eigenschaft
    #age = 30;

    #privateMethod() {
        console.log("Dies ist eine private Methode");
    }

    getDetails() {
        return "Name: "$"{this.#name}, Alter: "$"{this.#age}";
    }
}

const person = new Person();
console.log(person.getDetails());
console.log(person.#name); // Fehler, da #name privat ist  
            

Object Destructuring (Objekt-Destrukturierung)

Object Destructuring ist eine Technik in JavaScript, um Werte aus einem Objekt in separate Variablen zu extrahieren. Dies ist hilfreich, um auf die Eigenschaften eines Objekts zuzugreifen, ohne auf jedes einzelne mit "objekt.eigenschaft" zuzugreifen.


const person = {
    name: "Alice",
    age: 30,
    city: "New York"
};

const { name, age } = person;

console.log(name); // "Alice"
console.log(age);  // 30
            

Spread Operator

Der Spread-Operator (...) in JavaScript ist ein nützliches Feature, das in verschiedenen Kontexten verwendet werden kann, um Werte aus Arrays, Objekten oder anderen iterierbaren Datenstrukturen auszubreiten (zu "verbreiten") oder zusammenzuführen.

Verbreitung von Arrays

Der Spread-Operator kann verwendet werden, um die Elemente eines Arrays in ein neues Array zu kopieren oder in eine Funktion zu übergeben.


const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];

const combinedArray = [...arr1, ...arr2];
console.log(combinedArray); // [1, 2, 3, 4, 5, 6]

// Kopieren eines Arrays
const copyOfArr1 = [...arr1];
console.log(copyOfArr1); // [1, 2, 3]
            

Verbreitung von Objekten

Der Spread-Operator kann auch verwendet werden, um die Eigenschaften eines Objekts in ein neues Objekt zu kopieren oder in eine Funktion zu übergeben.


const obj1 = { name: "Alice", age: 30 };
const obj2 = { city: "New York" };

const combinedObject = { ...obj1, ...obj2 };
console.log(combinedObject); // { name: "Alice", age: 30, city: "New York" }

// Kopieren eines Objekts
const copyOfObj1 = { ...obj1 };
console.log(copyOfObj1); // { name: "Alice", age: 30 }
            

Verbreitung in Funktionen

Der Spread-Operator kann in Funktionen verwendet werden, um eine unbekannte Anzahl von Argumenten zu akzeptieren oder in einer Funktion Parameter in ein Array umzuwandeln.


function sum(...numbers) {
    return numbers.reduce((total, num) => total + num, 0);
}

console.log(sum(1, 2, 3, 4, 5)); // 15

// Umwandlung von Argumenten in ein Array
function toArray(...args) {
    return args;
}

console.log(toArray(1, "Hello", true)); // [1, "Hello", true] 
            

Verbreitung mit Array-Literals

Der Spread-Operator kann auch verwendet werden, um Werte in einem Array-Literal auszubreiten.


const numbers = [1, 2, 3];
const newArray = [...numbers, 4, 5];
console.log(newArray); // [1, 2, 3, 4, 5]
            

Verwendung in Object Literals

Der Spread-Operator kann in Objektliteralen verwendet werden, um Eigenschaften aus anderen Objekten in ein neues Objekt zu kopieren.


const person = { name: "Alice", age: 30 };
const details = { ...person, city: "New York" };
console.log(details); // { name: "Alice", age: 30, city: "New York" }
            

Der Spread-Operator ist eine leistungsstarke Funktion in JavaScript, die die Arbeit mit Arrays, Objekten und Funktionen erleichtert. Er bietet eine einfache Möglichkeit, Werte zu kombinieren, zu kopieren oder zu extrahieren, was die Entwicklung von JavaScript-Anwendungen effizienter macht.




Dies sind einige fortgeschrittene Konzepte und Techniken in Bezug auf JavaScript-Klassen. Sie sind nützlich, um den Code zu organisieren, die Privatsphäre zu wahren und die Flexibilität in der Entwicklung zu erhöhen.