Hallo,
function Knopf (x, y, beschriftung) {
alert(this.constructor === EingabeElement);Was machen denn die 3 Gleichheitszeichen?
Das ist der Identitätsoperator. this.constructor === EingabeElement gibt zurück, ob die beiden Objekte identisch sind. Sie sind es, also kann man this.constructor() aufrufen. Daher zur Verdeutlichung dieser alert.
this.constructor(x, y);
constructor ist doch irgendeine Funktion. Ist die vorgegeben?
constructor ist die Konstruktorfunktion des Prototyps, also der Basisklasse (siehe).
Warum muss ich jetzt explizit einen Konstruktor aufrufen? Das muss ich doch sonst nicht machen?
In der Konstruktorfunktion (im Folgenden einfach: Konstruktor) von EingabeElement setzt du die Eigenschaften, darunter eine öffentliche, priviligierte Funktion. Du benutzt dabei Parameter, die dem Konstruktor übergeben wurden. Das ist das Problem.
function EingabeElement (x,y) {
alert("Konstruktor EingabeElement aufgerufen");
this.x = x;
this.y = y;
this.elementId = 0;
this.setX = function (sX) {
this.x = sX;
};
}
function Knopf (x, y, beschriftung) {
// this.constructor(x, y);
this.value = beschriftung;
}
Knopf.prototype = new EingabeElement();
alert(Knopf.prototype.x);
alert(Knopf.prototype.setX);
var beispielknopf = new Knopf(1, 2, "Titel");
alert(beispielknopf.x);
alert(beispielknopf.setX);
Als Prototyp für Knopf wird eine Instanz von EingabeElement verwendet. Dazu wird der EingabeElement-Konstruktor aufgerufen - aber ohne Parameter. Die Methode setX wird korrekt vererbt, aber die Parameter x und y, die du dem Knopf-Konstruktor übergibst, werden nicht in den Objekteigenschaften x und y gespeichert.
Man hat einige Möglichkeiten, um das Problem zu umgehen. Entweder man schreibt
this.x = x;
this.y = y;
this.elementId = 0;
noch einmal in den Knopf-Konstruktor. Oder man ruft eben wie gezeigt den EingabeElement-Konstruktor im Knopf-Konstruktor noch einmal auf, diesmal mit Parametern.
Wenn man alle Methoden/Eigenschaften nur im Konstruktor notiert, dann braucht man Knopf.prototype = new EingabeElement; eigentlich nicht. Denn alle Eigenschaften/Methoden werden ja sowieso beim Aufruf des EingabeElement-Konstruktors im Knopf-Konstruktor kopiert. Allerdings funktioniert dann der Zugriff auf this.construtor nicht.
In dem Fall könntest du EingabeElement.call(this, x, y); verwenden. Oder man hängt EingabeElement als Methode an this. Dann wird es ebenfalls im Kontext der aktuellen Instanz ausgeführt, das heißt »this« in der EingabeElement-Methode verweist auf die aktuelle Instanz.
function EingabeElement (x,y) {
alert("Konstruktor EingabeElement");
this.x = x;
this.y = y;
this.elementId = 0;
this.setX = function (sX) {
this.x = sX;
};
}
function Knopf (x, y, beschriftung) {
this.constructor = EingabeElement;
this.constructor(x, y);
this.value = beschriftung;
}
var beispielknopf = new Knopf(1, 2, "Titel");
alert(beispielknopf.x);
alert(beispielknopf.setX);
Das ist dann aber eine prototypische Vererbung mehr. Man kann zwar Eigenschaften/Methoden über EingabeElement.prototype.XYZ definieren, sie werden aber nicht an Instanzen von Knopf vererbt.
Siehe auch http://forum.de.selfhtml.org/archiv/2005/2/t100600/ und http://phrogz.net/JS/Classes/OOPinJS2.html.
Mathias