Mit ECMAScript6 kann man auch über das Schlüsselwort class eine Klasse erzeugen, von der man dann viele Objekt Instanzen erzeugen kann. Das ist eine moderenere und einfachere Möglichkeit.
'use strict';
class Hut {
constructor(ecken, farbe){
this.ecken = ecken;
this.farbe = farbe;
}
sing(){console.log("Mein " + this.farbe + "er Hut der hat " + this.ecken + " Ecken.")};
}
let dreispitz = new Hut(3, "rot");
dreispitz.sing();
Funktionen die man in Klassen definiert werden Methoden genannt. Hier unterscheidet man zwischen statischen Methoden und Instanz-Methoden (Prototyp-Methoden)
Eine statische Methode gehört direkt zum "Bauplan" (der Klasse Number). Du musst kein konkretes Objekt (keine konkrete Zahl) erstellt haben, um sie zu nutzen. Sie ist wie ein Werkzeug, das im Regal der Klasse liegt.
Diese Methoden gehören nicht der Klasse selbst, sondern einer Instanz (einem konkreten Objekt/einer konkreten Zahl). Sie arbeiten mit dem Wert, auf dem sie aufgerufen werden.
In der Fachsprache unterscheidet man hier zwischen statischen Methoden und Instanz-Methoden (oder Prototyp-Methoden).
Eine statische Methode gehört direkt zum "Bauplan" (der Klasse Number). Du musst kein konkretes Objekt (keine konkrete Zahl) erstellt haben, um sie zu nutzen. Sie ist wie ein Werkzeug, das im Regal der Klasse liegt.
Aufruf: Immer über den Klassennamen (Number.method()).
Zweck: Meistens Hilfsfunktionen, die etwas erschaffen oder prüfen (z. B. einen String in eine Zahl umwandeln).
Besonderheit: Da parseInt() schon existierte, bevor es die Klasse Number in JavaScript gab, ist sie zusätzlich auch als globale Funktion verfügbar. parseInt() und Number.parseInt() machen also exakt das Gleiche.
Diese Methoden gehören nicht der Klasse selbst, sondern einer Instanz (einem konkreten Objekt/einer konkreten Zahl). Sie arbeiten mit dem Wert, auf dem sie aufgerufen werden.
Aufruf: variable.method() oder (5.123).toFixed().
Zweck: Den konkreten Wert des Objekts manipulieren oder formatieren.
Warum nicht statisch? Es würde keinen Sinn ergeben, Number.toFixed(2) zu schreiben, weil die Funktion ja wissen muss, welche Zahl sie auf zwei Stellen runden soll. Sie braucht den Kontext einer existierenden Zahl.
| Merkmal | Statische Methode | Instanz-Methode |
|---|---|---|
| Beispiel | Number.isInteger(x) | (5.123).toFixed(2) |
| Wo "lebt" sie? | Direkt auf dem Konstruktor (Number) | Auf dem Prototyp (Number.prototype) |
| Kontext | Hat keinen Bezug zu einer speziellen Zahl. | Arbeitet mit einer konkreten Zahl (this). |
| Analogie | Ein Werkzeug in der Werkstatt ("Säge"). | Eine Eigenschaft des gebauten Möbelstücks ("Länge messen"). |
"Statische Methoden wie Number.parseInt() sind wie eine Maschine, in die man etwas hineinwirft, um ein Ergebnis zu erhalten. Instanz-Methoden wie .toFixed() sind Fähigkeiten, die jede Zahl von Geburt an besitzt, um sich selbst zu verändern oder darzustellen."
Technischer Hintergrund (für Fortgeschrittene):
JavaScript ist hier etwas magisch. Wenn du (5).toFixed() schreibst, verwandelt JavaScript die primitive Zahl 5 kurzzeitig in ein Objekt (new Number(5)), damit sie auf die Methoden des Prototyps zugreifen kann. Das nennt man Autoboxing.
Math.round(x) ist statisch (gehört zur Klasse Math).
x.toFixed(3) ist eine Instanz-Methode (die Zahl x formatiert sich selbst).
Wenn wir uns die Klasse Number wie einen Container vorstellen, sieht die Struktur (vereinfacht) so aus:
class Number {
// 1. STATISCHE METHODE
// Sie hängt direkt an der Klasse.
static parseInt(string) {
/* ... Logik ... */
}
// 2. INSTANZMETHODE (Prototyp-Methode)
// Sie ist so definiert, dass sie für jedes "Kind" (Instanz)
// der Klasse verfügbar ist.
toFixed(digits) {
// 'this' bezieht sich hier auf die konkrete Zahl (z.B. 5.123)
/* ... Logik ... */
}
}
Ja. In der modernen Klassen-Syntax von JavaScript schreibst du beide direkt in den class-Block. Der einzige Unterschied im Code ist das Schlüsselwort static.
Mit static: Die Funktion gehört der Klasse selbst.
Ohne static: Die Funktion wird an alle Objekte vererbt, die aus dieser Klasse entstehen.
Das Zauberwort heißt this.
In einer Instanzmethode wie toFixed() kann die Funktion über das Wort this auf den Wert der Zahl zugreifen, die sie gerade aufruft. Wenn du (5).toFixed() schreibst, weiß die Methode durch this, dass sie mit der 5 arbeiten soll.
Eine statische Methode wie Number.isInteger() hat kein this, das eine konkrete Zahl kennt. Sie bekommt ihre Daten nur über die Argumente, die man in die Klammern schreibt.
class Hut {
// Statisch: Das Wissen der gesamten Hut-Welt
static sing() {
console.log("Hut ab!");
}
// Instanz-Methode: Eine Eigenschaft eines speziellen Hutes
putzen() {
console.log("Dieser Hut ist jetzt sauber.");
}
}
// 1. Der statische Weg:
Hut.sing(); // Funktioniert!
// 2. Der Instanz-Weg:
Hut.putzen(); // FEHLER! (Welcher Hut soll geputzt werden? Die Klasse weiß es nicht.)
let meinZylinder = new Hut();
meinZylinder.putzen(); // Funktioniert! (Jetzt wissen wir: Der Zylinder wird geputzt.)
meinZylinder.sing(); // FEHLER! (Instanzen haben keinen Zugriff auf statische Methoden der Klasse.)
Mittels dem Javascript Befehl eval() kann man Strings zu einem Objekt auflösen. Strings lassen sich verschicken und können dann empfangen und mittels eval() zu einem Objekt zusammengesetzt werden.
var auto = "({tueren:4, raeder:3})";
So eine Zeichenkette kann man an den Server schicken, der es dann verarbeitet. Oder man bekommt so eine Zeichenkette vom Server und kann diese dann mittesl eval() in ein Objekt umwandeln.
fahrzeug = eval(auto);
console.log(fahrzeug);