OOP mit JavaScript - Aggregation - Zugriffsrechte
1. Der feine Unterschied
Im Gegensatz zum Prototyping gibt es bei der Aggregation nur eine Richtung, nämlich von oben nach unten. Und das liegt daran, dass man hier innerhalb von Konstruktorfunktionen mit eigenen Objekten arbeitet, die aus anderen Konstruktorfunktionen erzeugt worden sind.
Ein Beispiel
function Panzer()
{
this.mgSchiessen = function()
{
alert ('Ratatat mit ' + this.mg + 'mm-MG');
}
}
function Kampfpanzer()
{
var pz = new Panzer;
this.mg = 7.62;
this.rumballern = function()
{
pz.mgSchiessen();
}
}
var kampfpanzer = new Kampfpanzer;
kampfpanzer.rumballern();
Erläuterung
Der Zugriff auf die Methode mgSchiessen
des Konstruktors Panzer
kann hier nur über die Referenz
pz
innerhalb(!) von Kampfpanzer
erfolgen. Wenn das Objekt kampfpanzer
darauf zugreifen möchte,
so muss die Referenz öffentlich zugreifbar sein. Also mit this.pz
und dann einem kampfpanzer.pz.mgSchiessen
.
2. Aber!
Die Methode mgSchiessen
funktioniert nicht so, wie sie sollte. Denn als Ergebnis bekommt man ein Ratatat mit
undefinedmm-MG
. Denn der Konstruktor Panzer
weiß gar nichts vom Kampfpanzer
. Wie auch? Dasselbe Verhalten
gibt es natürlich auch bei den Methoden. Jetzt könnte man auf die Idee kommen und im Panzer
ebenfalls eine Referenz à
la var kpz = new Kampfpanzer
zu erzeugen, um an die Eigenschaft mg
zu kommen.
Vergesst es!
Das ist Tinnef, Humbug, Blödsinn hoch drei. Das macht man bei vier oder fünf Konstruktorfunktionen und dann geht alles baden, weil man den Überblick verloren hat. Man dreht sich nur noch im Kreis und irgendwann ist einem schwindelig und man rennt gegen die Wand.
3. Ein Tipp
Wie ihr sehen könnt, sind die Zugriffsrechte beim Prototyping viel einfacher zu handhaben. Allerdings besteht hier immer die Gefahr, dass man aus Versehen etwas überschreibt. Trotzdem ist diese Form der Vererbung grundsätzlich erst mal vorzuziehen.
Mit Aggregationen sollte man dagegen nur in ganz speziellen Fällen arbeiten. Also immer dann, wenn man konsequent von "oben" nach "unten" vererben will.
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt