Polymorphie kann als Grundprinzip von JavaScript verstanden werden und ist als Duck Typing-Konzept implementiert. In diesem Konzept wird die Anwendbarkeit von bestimmten Methoden nicht an die Ableitung einer Klasse von einer bestimmten Superklasse geknüpft, sondern an das Vorhandensein bestimmter Merkmale. In JavaScript beschränkt sich dieses Merkmal allein auf Eigenschaftsnamen und nicht auf eine Beziehung in der Prototypenkette.
Die Ursache hierfür liegt in der dynamischen Typisierung und der damit verbundenen Bindung eines Objekts an eine Methode zur Laufzeit. Die semantische Substituierbarkeit in einem bestimmten Kontext obliegt folglich der Sorgfalt des Programmierers. In Java ist die Semantik durch die Generalisierungshierarchie gegeben, da dort ein Objekt immer zu einer Klasse der Vererbungshierarchie gehört.
Ein theoretisches Beispiel für Polymorphie in JavaScript wäre ein Array graphObjs, welches grafische Objekte wie Kreise, Rechtecke und dergleichen enthält. Jedes Objekt enthält dabei eine Zeichnen-Methode draw(), die in den jeweiligen Objekten unterschiedlich implementiert ist. Über eine einfache Schleife könnten dann alle Objekte gezeichnet werden:
graphObjs[i].draw();
Das Array enthält Elemente unterschiedlicher Typen, dessen Zeichnen-Methoden denselben Namen haben. Jedoch wird für jedes Element immer die zugehörige, spezifische Methode ausgeführt.
Die Konzepte der Aggregation und Assoziation sind in JavaScript implementiert: Objekte können neben Attributen auch Methoden enthalten, welche in JavaScript bekanntermaßen auch Objekte sind. Daher lassen sich Objekte in Objekten anlegen und Objekte können auf andere Objekte verweisen. Es ist also möglich komplexe Objekte zu erstellen.
Im folgenden Beispiel wird dies gezeigt:
function Name(fName, lName) {
this.firstName = fName;
this.lastName = lName;
}
function Arbeiter(dept, fName, lName) {
this.dept = dept;
//Aggregation: Objekt Name wird ein Teil von Arbeiter
this.name = new Name(fName, lName);
//Assoziation: toString-Methode verweist auf printArbeiter
this.toString = printArbeiter;
}
function printArbeiter() {
var res = this.dept + ": " + this.name.firstName + " " + this.name.lastName;
document.writeln(res);
}
[top]