In JavaScript gibt es nicht wirklich Klassen wie Sie von C++ oder Java her
bekannt sind. Vielmehr ist es über sogenannte Konstruktor - Funktionen möglich
Objekte nach einem bestimmten Muster mit gewissen Eigenschaften und Methoden
zu instanzieren. Sowohl Array() String() wie auch Number()
sind solche Konstruktor - Funktionen, wird nun beispielsweise ein Array instanziert
so wird ebendiese Funktion aufgerufen und das Array erhält eine Eigenschaft
length und Methoden wie beispielsweise reverse().
Wird im nachfolgenden Abschnitt oder anderen Kapiteln von "Klassen" gesprochen
so ist die Konstruktor Funktion gemeint.
In den vorhergehenden Kapiteln waren unsere Objekte sehr unflexibel, möchte
man beispielsweise ein neues Objekt mit identischen Eigenschaften und Methoden
aber anderen Werten erstellen so muss man dieses völlig neu definieren. Mit
den obenerwähnten Konstruktor Funktion geht dies jedoch einfacher, denn diese
dienen als Vorlage, mit ihnen können anschliessend Instanzen (Objekte) erstellt
werden welche alle die gleichen Eigenschaften besitzen jedoch mit unterschiedlichen
Werten.
Sprechen wir beispielsweise von einem Menschen, so könnte eine Klasse allgemeine
Eigenschaften wie Name, Geschlecht und Alter vergeben. Innerhalb der Klasse
hat man über this Zugriff auf das aktuelle Objekt, in der Konstruktor
- Funktion also auf das soeben neu erstellte. Eine Instanz einer Klasse kann
man mit dem reserviertem Schlüsselwort new gefolgt von dem Klassennamen
erzeugen. Wird die Funktion ohne new aufgerufen so wird sie als
normale Funktion behandelt und this
zeigt weiterhin auf das window Objekt. Zur Veranschaulichung ein
kurzes Beispiel:
human = function(name,sex,age){
this.name = name;
this.sex = sex;
this.age = age;
};
marc = new human("marc","male",17);
alert(marc.name); // "marc"
alert(marc.sex); // "male"
alert(marc.age); // 17
mirj = new human("mirj","female",17);
alert(mirj.name) // "mirj"
alert(mirj.sex) // "female"
alert(mirj.age) // 17
Es ist ebenfalls möglich den Klassen selbst Eigenschaften zuverleihen, sie
werden nicht an die Instanzen weiter gegeben. Im folgenden Beispiel wird
unsere Mensch Klasse um eine Eigenschaft Bevölkerung erweitert, diese wird jeweils
beim erzeugen einer neuen Instanz, also bei der Geburt eines Menschen um eins
erhöht. Dabei wird die constructor
Eigenschaft welche auf die Klasse selbst zeigt verwendet, analog dazu könnte
man auch human.population++; notieren.
human = function(){
this.constructor.population++;
};
human.population = 0;
marc = new human();
alert(human.population); // 1
stefan = new human();
alert(human.population); // 2
mirj = new human();
alert(human.population); // 3
alert(marc.population) // undefined
Ähnliches sieht man beim Math Objekt, es ist nicht möglich eine
Instanz davon zu erzeugen doch auf Eigenschaften wie Math.PI kann
problemlos zugegrifen werden.