Hauptmenü

Untermenü

OOP mit JavaScript - Prototypen - this und that

1. Private Methoden und Eigenschaften

Hier gelten zunächst mal dieselben Regeln wie für alle Konstruktorfunktionen. Nämlich, dass man außerhalb derselben nicht auf die privaten Eigenschaften und Methoden zugreifen kann. Gut, das geht bei Klassen in PHP ja auch nicht. In JavaScript kommt halt noch diese idiotische Sache mit dem this und window hinzu.

2. this und that

Innerhalb einer Konstruktorfunktion kann man ja mit einer internen Referenz à la var that = this; arbeiten, wenn private Methoden auf öffentliche Eigenschaften oder Methoden zugreifen sollen. Clevere Kerlchen könnten nun auf die Idee kommen und das auch bei Prototypen einsetzen. Anstelle eines var wird dagegen ein this genommen. Also so.


function Kampfpanzer()
{
  this.that     this;
  var besatzung 4;    
}
function SpezialPanzer()
{
  this.kanone  220;
  this.machWas = function()
  {
    alert (this.that.besatzung);
  }
}
SpezialPanzer.prototype = new Kampfpanzer;

var supipanzer          = new SpezialPanzer;
supipanzer.machWas();  

Denkste!

Leider bekommt man hier das übliche undefined um die Ohren genauen. Bei einem console.log(this.that) anstelle des alert könnt ihr im Firebug an der Konsole auch wunderbar sehen, dass da ein besatzung nicht auftaucht.

3. Noch etwas Wichtiges

Wenn man innerhalb(!) einer Konstruktorfunktion mit var that = this; arbeitet, so gilt es noch eine Feinheit zu beachten. Dazu nehmen wir den folgenden Code. Ach ja, lasst euch von der zweiten Zeile nicht irritieren, die kann tatsächlich vor den Konstruktorfunktionen stehen. Das hat aber gar nichts mit dem eigentlichen Problem zu tun.


// so was funktioniert übrigens auch
SpezialPanzer.prototype = new Kampfpanzer;
function Kampfpanzer()
{
  var that     this;
  this.kanone  120;
  this.ballern = function()
  {
    schiessen();
  }
  function schiessen()
  {
    alert ('Bumm bumm mit ' that.kanone 'mm-Kanone');
  } 
}
function SpezialPanzer()
{
  this.kanone  220;
}

var kampfpanzer = new SpezialPanzer;
kampfpanzer.ballern();

Hä!

Ja genau. Hä? Denn im Gegensatz zu dem Beispiel hier liegt das Kaliber nicht bei 220 sondern nur bei 120. Und auch dieses angebliche Mysterium lässt sich ganz einfach erklären. Denn this verweist ja immer auf das eigene(!) Objekt. In diesem Fall also Kampfpanzer. Und der hat halt nur so eine kleine Wumme.

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