objektvererbung mit prototype. instanzname geht verloren

aceman

Grünschnabel
Bei den folgenden Funktionen, wird erst ein Objekt writeRTE erzeugt.
Dies bekommt einen Instanznamen zugewiesen (this.InstanceName = rte;)
danach wird die Funktion schreibeToolbar aufgerufen.
Diese soll durch Klick auf den Link die Funktion doFormat aufrufen.
Doch leider bekomme ich immer nur den InstanceName des zuletzt erzeugten Objektes zurück (in diesem Fall Frieda). Warum bloß?
Bin leider noch ziemlich neu in OOP und sozusagen ins kalte Wasser gesprungen. Das Problem treibt mich noch in den Wahnsinn.
Wenn ihr nicht noch einen verrückten mehr auf dieser Welt haben möchtet, dann helft mir bitte.

Thanx
aceman

P.S: Der folgende Code ist javascript. Habe PHP nur wegen Highlighting verwendet.
PHP:
<html>

<head></head>
<body>
<script language="javascript">
writeRTE.prototype.schreibeToolbar = function(){
	instance = this;
	doFormat = function(command) {instance.doFormat(command)};
	document.writeln('<a href="#" onClick=doFormat(\''+instance.Groesse+'\')>'+instance.InstanceName+'</a>');
		 
}

writeRTE.prototype.doFormat = function(command){
	alert(this.InstanceName+' \n'+command);
}

function writeRTE (rte,groesse) {
		this.InstanceName	= rte;
		this.Groesse = groesse;
		this.schreibeToolbar();
	}
	
new writeRTE('hans','gross');
new writeRTE('frieda','klein');
</script>
</body>
 
Hallo,

versuch mal, die Memberfunktionen so einzubinden:
PHP:
function ClassXYZ(a_sVar1, a_sVar2)
{
    this.m_sVar1 = a_sVar1;
    this.m_sVar2= a_sVar2;

    this.doSomething = ClassFunc_doSomething;
    this.anotherFunc = ClassFunc_anotherFunc;
}

function ClassFunc_doSomething()
{
    window.alert('Member 1');

    return true;
}

function ClassFunc_anotherFunc()
{
    window.alert(this.m_sVar2);

    return true;
}
 
Hi

Du willst ja, wenn ich es richtig verstanden habe, dein Objekt mit dem Link "verbinden" und Methoden deines Objektes aufrufen, richtig?

Dazu fehlt die Referenzierung zwischen dem Link und deinem Objekt. Lösen kann man das, indem man den Link via DOM aufbaut und dem Link ein eigenes Attribut hinzufügt das auf das eigentliche Objekt referenziert.

Für Prototyping sehe ich in diesem Moment eigentlich keinen Sinn, da du ja nichts zur Laufzeit verändern willst (zumindest nach diesem Beispiel). Man könnte es so machen:
Code:
<html> 

<head></head> 
<body> 
<script language="javascript"> 
function writeRTE (rte,groesse) { 
    this.InstanceName = rte; 
    this.Groesse = groesse; 
    
    this.schreibeToolbar = function() {
        this.l = document.createElement('A');
        this.l.innerHTML = this.InstanceName;
        this.l.href = '#';
        this.l.ersteller = this; // referenzierung auf das Ersteller-Objekt
        this.l.onclick = function() {
            this.ersteller.doFormat(this); // Aufruf einer Methode des ersteller-Objektes mit übergabe des geklickten Links
        }
        this.l.style.color = '#f00';        
        document.getElementsByTagName("BODY")[0].appendChild(this.l);
    }

    this.doFormat = function(l) {
        var oColor = l.style.color;
        l.style.color = '#0f0'; // Farbe des Links ändern
        alert(this.InstanceName+' \n'+this.Groesse); 
        l.style.color = oColor; // Farbe des Links wieder zurücksetzen...        
    }
    
    this.schreibeToolbar(); 
} 
     
new writeRTE('hans','gross'); 
new writeRTE('frieda','klein'); 
</script> 
</body>
...das ist nur mal willkürlich runtergeschrieben, aber sollte das ganze klarer machen. Ein HTML-Objekt kann man genauso verwenden, wie jedes andere Objekt ;)

Ein Hinweis noch: Benutzt man diese Art auf 100 HTML-Elementen einer Seite, frisst das ganze erheblich Speicher (im IE zumindest), da die selbst erstellte Objekt-Referenz anschein irgendwo "hängen" bleibt und selbst nach einem Reload der Speicher nicht mehr freigegeben wird (evtl. 'n Bug?)... man sollte also bei grösseren Projekten die Zuweisung der Referenzen auf ein onunload-Event wieder entfernen. Die Instanzierung ohne eine Zuweisung ist in diesem Fall nicht angebracht...

Da diese Speichersache das einzige ist, was mich an dieser Technik stört, bin ich aber gerne für andere Lösungen offen :)

Gruss
Jan

PS: Ich benutze den Kram nur im IE... daher keine Garantie für andere Browser.
 
Mal schauen

Danke für die schnellen Antworten.

Das erste Beispiel hat mir nicht so geholfen, da ich ja aus der ersten Funktion die zweite aufrufen will.

Das zweite sieht mir schon eher nach einer Lösung aus, da ich eine ähnliche Vorgehensweise schon bei anderen Projekten gesehen habe.
Werde ich gleich mal ausprobieren
:)
 
Das erste Beispiel hat mir nicht so geholfen, da ich ja aus der ersten Funktion die zweite aufrufen will.
Wieso sollte das nicht gehen?
PHP:
function ClassXYZ(a_sVar1, a_sVar2)
{
    this.m_sVar1 = a_sVar1;
    this.m_sVar2= a_sVar2;

    this.doSomething = ClassFunc_doSomething;
    this.anotherFunc = ClassFunc_anotherFunc;
}

function ClassFunc_doSomething()
{
    window.alert('Memberfunktion 1');
    this.anotherFunc();

    return true;
}

function ClassFunc_anotherFunc()
{
    window.alert('Memberfunktion 2\n' + this.m_sVar2);

    return true;
}

oSample = new ClassXYZ('abc', 'def');

oSample.doSomething();
 

Neue Beiträge

Zurück