Hauptmenü

Untermenü

OOP mit JavaScript - Prototypen - Weitervererbung

1. Sinnvoll mit Prototyping arbeiten

Durch das Protyping kann man wunderbar Hierarchien aufbauen, wo man etwas von oben nach unten vererbt. Dazu bauen wir uns zunächst mal verschiedene Panzertypen.


function Panzer()
{
  this.ps     400;
  this.fahren = function()
  {
    alert ('Brumm, brumm mit ' this.ps ' PS');
  }
}
function Kampfpanzer()
{
  this.kanone    120;
  this.schiessen = function()
  {
    alert ('Bumm bumm mit ' this.kanone 'mm-Kanone');
  }
}
function SpezialPanzer()
{
  this.kanone 220;
}
function Pionierpanzer()
{
  this.schaeufelchen true;
  this.buddeln       = function()
  {
    alert ('Buddel, buddel');
  }
}

Im Moment ist das noch völlig sinnfrei, da weder der Kampfpanzer, der Pionierpanzer noch der Spezialpanzer fahren können. Das kann nur der Panzer, der beherrscht aber sonst nichts. Und das zusammen ist im alltäglichen Geschäft der Militärs doch eher hinderlich.

2. Die Vererbung

... läuft nun folgendermaßen ab.


Kampfpanzer.prototype   = new Panzer;
Pionierpanzer.prototype = new Panzer;
SpezialPanzer.prototype = new Kampfpanzer;

Erläuterung

Damit vor allem die PHPler begreifen, was wir soeben gemacht haben, müsst ihr euch das in etwa so vorstellen.


class Kampfpanzer   extends Panzer {...}
class Pionierpanzer extends Panzer {...}
class SpezialPanzer extends Kampfpanzer {...}

Panzer vererbt also alle öffentlichen Eigenschaften und Methoden auf Kampfpanzer und den Pionierpanzer. Und der Spezialpanzer erbt alle Eigenschaften und Methoden von Kampfpanzer und Panzer.

3. Nutzung


var supipanzer = new SpezialPanzer;
supipanzer.fahren();
supipanzer.schiessen();

var piopanzer = new Pionierpanzer;
piopanzer.buddeln();

Erläuterung

Konzentrieren wir uns zunächst mal auf das Objekt supipanzer. Das kann auf alle öffentlichen Eigenschaften und Methoden von Panzer und Kampfpanzer zugreifen. Es hat also ordentlich PS unter der Haube (gut der Leo 2 hat 1500, aber unser neuer Panzer ist extrem umweltfreundlich und hat einen geringen Spritverbrauch, damit Claudia nicht wieder rumflennt), verfügt über einen Turm und eine ordentliche Wumme, vulgo Kanone.

Aber das Teil hat ein noch größeres Kaliber als der Kampfpanzer. Denn der Spezialpanzer besitzt sozusagen eine Viagrakanone. Einfach ausgedrückt heißt das, dass wir in diesem Beispiel die Eigenschaft kanone von Kampfpanzer beim(!) Spezialpanzer überschrieben haben.

Der Pionierpanzer

... ist auch sehr interessant. Der leitet sich direkt vom Panzer ab. Das heißt, dass der keine kanone hat. Der besitzt lediglich ein schaeufelchen und kann buddeln. Wenn ihr versucht, mit dem Gerät auch noch rumzuballern, so führt das zu einem Fehler.


// Fehler
pionierpanzer.schiessen();

Ein Tipp

Wer von euch zum Beispiel mit Firefox und Firebug arbeitet, kann das Prinzip sehr schön erkennen, wenn man zum Beispiel ein console.log(supipanzer.prototype) in den Code einfügt und sich das Ergebnis an der Konsole anschaut.

zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt