OOP in JavaScript

Klassen

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

Klassen - Eigenschaften

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.