JavaScript und Objekte bzw. Klassen
Eine der ersten Hürden die ein erfahrener OO-Programmierer überwinden muss, ist das Fehlen des class Schlüsselwortes. Man könnte vielleicht eine Trennlinie ziehen zwischen objekt-orientiertem Programmieren und einem neuen Pendant klassen-orientierte Programmierung. Dabei lässt sich dann JavaScript bei Ersterem einordnen.
In JavaScript ist quasi alles ein Objekt. Das beinhaltet damit String,Number,
Function, Array und so weiter und natürlich das Object selbst.
Die Spezifikation sagt, dass ein String-Literal "on-the-fly" umgewandelt wird in ein String-Objekt, wenn ein
Eigenschaften- oder Methoden-Zugriff erfolgt. Objekte sind ganz allgemein zu verstehen als Sammlungen
von key-value Paaren (plus interne "Magie").
Klassen im Sinne der herkömmlichen Objekt-Orientierten Programmierung existieren wiederum gar nicht. JavaScript verfolgt hier einen komplett anderen Ansatz, der uns zwingt, zunächst einmal die bekannte OOP zu verlernen.
Creating Objects
Ein JavaScript-Objekt kann auf unterschiedlichste Weise erzeugt werden. Die Varianten können reduziert werden auf:
- Objekt-Initialisierer
- Konstruktor - Funktion
- Object.create - Methode
Beginnen wir mit dem Objekt-Initialisierer
var e1 = {};
var c1 = {
nr: 1,
firstname: "Klaus",
lastname: "Lage"
};
var c2 = new Object({
nr: 1,
firstname: "Klaus",
lastname: "Lage"
});
Eigenschaften
Properties können jederzeit definiert werden. Sowie bei der Definition als auch beim Abruf sind zwei syntaktische Varianten erlaubt:
- Punkt-Operator
objekt.prop = value- Array-Zugriff
objekt["prop"] = value
Bisher sehen unsere Objekte eher aus wie Datenstrukturen. Deswegen zum nächsten Schritt:
Konstruktor-Funktionen
function Leer() {};
var e2 = new Leer();
var Article = function( nr, name ) {
this.nr = nr;
this.name = name;
}
var a1 = new Article(1, "Berliner Weiße");
Anmerkung: Konstruktor-Funktionen beginnen nach Konvention mit einem Großbuchstaben.
Aber was macht dieses this hier?
Zunächst ist this ein Verweis. Worauf this verweist entscheidet der Kontext:
- Global: window (oder das global unter z.B. node)
- In einer Funktion: ebenso diesen globalen Kontext (bzw. undefined falls wir uns im strict-Mode befinden).
- In einem Konstruktor bzw. einer Methode(!): das Objekt.
Methoden
Wie sieht denn jetzt eine Methode aus? Die Spezifikation sagt: Eine Methode ist eine Funktion die ein Wert einer Eigenschaft ist.
function Customer( id, firstname, lastname ) {
this.id = id;
this.firstname = firstname;
this.lastname = lastname;
this.fullname = function () { return this.firstname + " " + this.lastname };
}
Natürlich lassen sich Methoden genau wie Properties auch dynamisch hinzufügen.
Eigenschaften und Methoden des Object-Typs
Prinzipiell erzeugt also unsere Konstruktor-Funktion ein Object mit zusätzlichen Eigenschaften.
Die vorhandenen Eigenschaften fasst die Referenz zusammen. Unter anderem ist das eine
constructor-Property, die unsere Konstruktor-Funktion enthält,
sowie zum Beispiel auch eine toString-Methode.