Hallo,
function extendedElement(elm) {
this.element = elm;
this.echo = function() {
alert(this); /* ist beim direkten Aufruf die KlassenInstanz
aber beim Aufruf über onmouseover das element von dem der Event stammt */
alert( "has the value: " + this.element.value); /* hier möchte ich evtl.
noch andere eigenschaften der Instanz benutzen */
Mir ist keine Möglichkeit bekannt, wie du umgehen kannst, dass this immer auf das Objekt zeigt, dem der Event passierte. Die Browser missachten hier anscheinend konsequent, dass echo eine Methode eines anderen Objektes ist.
Auf http://www.quirksmode.org/js/this.html wird beschrieben, dass in jedem Fall das Funktionsobjekt kopiert wird und die Funktion echo somit zum input-Elementobjekt gehört. Sie wird also gar nicht mehr als Methode eines extendedElement-Objektes aufgerufen. Du hättest sie also auch außerhalb bzw. ein allen Möglichkeiten Zusammenhängen deklarieren können, es käme auf dasselbe heraus. Dass das selbst bei addEventListener der Fall ist, verblüfft mich schon. Nach reinen ECMAScript-Regeln hast du Recht: this sollte auf eA als Instanz von extendedElement zeigen.
Du könntest höchstens beide Objekte miteinander verknüpfen:
this.element = elm; (wie gehabt)
this.element.extendedElement = this;
In echo hast du dann über this.extendedElement Zugriff auf das zugehörige extendedElement-Objekt und du kannst auf dessen Eigenschaften und Funktionen zugreifen.
Andererseits, was hast du letztlich konkret vor, also über dein Beispiel hinaus? Du könntest wahrscheinlich ohne new arbeiten und einfach eine Funktion ausführen, die das input-Elementobjekt mit gewissen Eigenschaften und Funktionen versorgt:
function extendedElement (obj) {
obj.eigenschaft = ...;
obj.funktion = function (...) {...}
}
var input1 = document.getElementById("a");
extendedElement(input1);
alert(input1.eigenschaft);
input1.funktion(...);
usw.
Im Übrigen spricht man bei JavaScript von Prototypen, nicht von Klassen.
Mathias