Hauptmenü

Untermenü

OOP mit JavaScript - Prototypen - Zugriffsrechte Teil 2

1. Ein "Phänomen"

Bei Methoden gilt praktisch dasselbe wie bei den Eigenschaften. Es gibt nur eine klitzekleine Feinheit. Die mich dafür aber einen ganzen Abend beschäftigt hat. Und zwar muss der Aufruf "oben" erfolgen. Um euch das genauer zu erklären, schauen wir uns mal folgendes Beispiel an.


function Panzer()
{
  ...
  this.mgSchiessen();  
}
function Kampfpanzer()
{
  this.mg           7.62;
  this.mgSchiessen = function()
  {
    alert ('Ratatat mit ' this.mg 'mm-MG');
  }
}
Kampfpanzer.prototype = new Panzer;
var kampfpanzer       = new Kampfpanzer;

Erläuterung

Hier haut es euch eine Fehlermeldung um die Ohren. Denn Panzer hat zu diesem Zeitpunkt keine Zugriffsmöglichkeit auf die Methode mgSchiessen von Kampfpanzer. Denn es erfolgt kein Aufruf von oberhalb. Gut, man sollte in Konstruktorfunktionen meiner Meinung nach eh nicht automatisch Methoden aufrufen, aber das nur am Rande.

Der Grund

... für dieses seltsam anmutende Verhalten erklärt sich aus dem Prototypen-Modell. Denkt mal genau darüber nach und fragt euch auch, was zuerst passiert. Vielleicht kommt ihr selber auf die Lösung.

2. So macht man es richtig

Dazu gibt es zwei Möglichkeiten. Man kann zum Beispiel den Aufruf der Methode mgSchiessen in Panzer ebenfalls in eine eigene Methode kapseln und die dann über die Referenz aufrufen.


function Panzer()
{
  this.rumballern = function()
  {
    this.mgSchiessen();  
  }
}
function Kampfpanzer()
{
  this.mg           7.62;
  this.mgSchiessen = function()
  {
    alert ('Ratatat mit ' this.mg 'mm-MG');
  }
}
Kampfpanzer.prototype = new Panzer;
var kampfpanzer       = new Kampfpanzer;
kampfpanzer.rumballern();

Oder wenn man schon beim Erzeugen eines "Panzer"-Objektes sofort losrotzen will, so ruft man zum Beispiel die Methode in einer "höheren" Konstruktorfunktion auf.


function Panzer()
{
  this.ballern = function()
  { 
    this.mgSchiessen();
  }
}
function Kampfpanzer()
{
  this.mg 7.62;
  this.mgSchiessen = function()
  {
    alert ('Ratatat mit ' this.mg 'mm-MG');
  }
}
function SpezialPanzer()
{    
  this.ballern()
}

Kampfpanzer.prototype   = new Panzer;
SpezialPanzer.prototype = new Kampfpanzer;
var supipanzer          = new SpezialPanzer;

3. Ein Hinweis

Manche von euch werden sich jetzt sicher fragen, was der Blödsinn soll. Nicht das "Phänomen", sondern mein Geschreibsel. So programmiert doch keine Sau (oder sollte es zumindest nicht). Außerdem ist es doch ein wenig unwahrscheinlich, dass man in eine solche Situation kommt.

Wohl wahr, aber

... es sei denn, ihr programmiert ziemlich schlampig. Ich selber bin nur durch Zufall beim Ausprobieren darauf gestoßen. Und da ich meinen Auftritt auch als internes Nachschlagewerk missbrauche, habe ich das hier mal zu Papier (HTML) gebracht.

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