Hallo,
function Control()
{
this.Paint = function()
{
[mach was]
}
}function Label()
{
this.Paint()
{
<baseclass>.Paint();
[mach noch mehr]
}
}
Label.prototype = new Control();
Äh, du kannst natürlich schreiben:
Label.prototype.Paint();
Aber das hat nix mit prototypischer Vererbung zu tun, da könntest du auch einfach so ein Control-Objekt instantiieren, um auf die Paint-Methode Zugriff zu haben.
Der Witz bei dieser bzw. Siechfreds Lösung (sie sind funktional identisch): this ist in Paint und Paint keinesfalls identisch. Wenn du in der Paint-Methode von Control etwas an this änderst, dann am Prototype! Ist ja auch klar, schließlich schreibst du:
Label.prototype = new Control();
Der Control-Konstruktor wird aufgerufen und dem erzeugten Objekt wird die Paint-Methode angehängt. Der Rückgabewert von new Control ist dieses neue Objekt wird in Label.prototyp gespeichert.
Ist dir klar, was das heißt? Wenn ja, wirst du sehn, wie abwegig es ist... ;) Auf diese Weise hat Control.Paint auch keinen Zugriff auf Eigenschaften, die durch den Label-Konstruktor oder Label-Methoden gesetzt wurden. Und wenn du in Control.Paint eine Eigenschaft setzt, haben diese ALLE Lebel-Objekte - dank prototypischer Vererbung. Aber Label.Paint kann ebensowenig auf auf Eigenschaften zugreifen, die in Control.Paint gesetzt werden. Damit reitest du dich nur in Schwierigkeiten.
Bei prototypischer Vererbung kannst du halt nicht zwei Methoden gleichen Namens haben. Normalerweise überschreibt die Methode, die im abgeleiteten Konstruktor (Label) definiert wird, die Methode, die im Basis-Konstruktor (Control) zugewiesen wird und über den Prototyp vererbt wird.
Jetzt kann man sich natürlich andere Lösungen ausdenken, indem man die Basis-Paint speichert und dann die vererbte Methode überschreibt, um wiederum die zwischengespeicherte alte aufzurufen:
function Control() {
this.Paint = function() {};
}
function Label() {
this.basePaint = this.Paint;
this.Paint = function () {
this.basePaint();
};
}
Label.prototype = new Control();
var myl = new Label;
myl.Paint();
Vorteil ist halt, dass man hier wirklich am selben Objekt operiert, wenn man this verwendet. Und man fummelt auch nicht am Prototyp von allen Label-Instanzen herum.
Mathias