gruss Thomas,
die verwendung eines prototype-objektes, wie es
regenfeld alias Bernhard Peissl aufzeigte, ist bei
umfangreicher objektorientierter programmierung in
JavaScript sehr elegent und (weil) speicherplatzschonend;
ich zitiere aus meiner JavaScript-Bibel, da ich es selber
nicht in anschaulichere worte zu fassen vermag -
(ISBN 3-930673-56-8) /
O'REILLY - JavaScript Das umfassende Referenzwerk -
Seite 110 / Kapitel: 7.4 Objektprototypen:
ab NNAV 3 und MSIE 3 "... gibt es noch einen anderen Weg, die
Methoden, Konstanten und sonstigen Eigenschaften festzulegen,
die von allen Objekten einer Klasse unterstuetzt werden sollen.
Diese Technik besteht darin, die Methoden und sonstigen Eigen-
schaften in einem PROTOTYPEOBJEKT fuer die Klasse zu definieren.
Ein Prototypeobjekt ist ein besonderes Objekt, das mit der Konst-
ruktorfunktion einer Klasse verbunden ist ..."
bei regenfeld: "Book.prototype.addChapter"
// Die Funktion, zu einer Instanzmethode machen
Book.prototype.addChapter = addChapter;
Book.prototype.getChapter = getChapter;
// Konstruktor für das Buch
function Book(Titel, Autor) {
this.Titel = Titel;
this.Autor = Autor;
this.Kapitel = new Array();
}
// "Pseudo-Konstruktor" für die Kapitel
function addChapter(Index, Ueberschrift) {
this.Kapitel[Index] = Ueberschrift;
}
// Und auch ne Methode zum ausgeben:
function getChapter (Index) {
return this.Kapitel[Index];
}
"... und eine wichtige
Besonderheit aufweist: Jede Eigenschaft, die fuer das Prototype-
objekt einer Klasse definiert wird, erscheint wie eine Eigenschaft
eines jeden Objekts dieser Klasse. Dies gilt fuer alle Eigen-
schaften - unabhaengig davon, ob sie dem Prototyp vor oder nach
der Definition der einzelnen Objekte hinzugefuegt werden. Die
Eigenschaften des Prototypobjekts einer Klasse werden von allen
Objekten dieser Klasse gemeinsam genutzt (d.h., die einzelnen
Objekte erhalten keine eigene Kopie der Prototypeigenschaften,
so dass der Speicherbedarf sehr gering bleibt)."
noch wichtiger:
"Die Eigenschaften des Prototypobjekts einer Klasse koennen ueber
alle Objekte der Klasse ausgelesen werden. Auch wenn Sie Eigen-
schaften dieser Objekte zu sein scheinen, sind sie dies nicht
wirklich. Es gibt nur ein Exemplar jeder Prototypeigenschaft, und
dieses Exemplar wird von allen Objekten einer Klasse geteilt. Wenn
Sie eine dieser Eigenschaften eines Objekts 'lesend' ansprechen,
lesen sie also tatsaechlich den gemeinsamen Wert aus dem Prototyp-
objekt ..." ACHTUNG "... 'Setzen' Sie andererseits den Wert
einer solchen Eigenschaft fuer ein bestimmtes einzelnes Objekt,
erzeugen Sie tatsaechlich eine neue Eigenschaft dieses einen
Objekts. Von nun an 'ueberlagert' oder versteckt die neu angelegte
Eigenschaft die gemeinsame Eigenschaft des Prototypobjekts - aber
nur in diesem einen Objekt."
das Fazit der Autoren zu diesem Kapitel lautet:
"Weil Prototypeigenschaften von allen Objekten einer Klasse gemein-
sam benutzt werden, ist es im allgemeinen sinnvoll, sie zur Fest-
legung von Eigenschaften zu benutzen, die fuer alle Objekte einer
Klasse identisch sind. Deswegen kann man mit ihnen auf geradezu
ideale Weise Methoden definieren. ... Wenn Ihre Klasse eine
Eigenschaft mit einem sehr gebraeuchlichen Standardwert definiert,
koennen Sie diese Eigenschaft samt ihrem Standardwert abenfalls
im Prototypobjekt definieren. Dann koennen die wenigen Objekte,
die von dem Standardwert abweichen sollen, ihr eigenes, nicht
gemeinsames Exemplar der Eigenschaft erhalten. Diesem Exemplar
kann dann jeweils ein vom Standard abweichender Wert zugewiesen
werden."
unter der folgenden URL findest Du einen Feature-Artikel, der
eine eigene JavaScript-klasse zum einfacheren dynamischen
erzeugen von HTML-tabellen-code beschreibt - aus heutiger
sicht ist der code nicht allzu elegant, aber sehr interessant
ist die tatsache, dass im klassen-konstruktor zur laufzeit
nur die eigenschaften einer tabelle initialisiert werden, die
auch tatsaechlich benutzt werden sollen;
http://aktuell.de.selfhtml.org/artikel/javascript/table-obj/index.htm
by(t)e by(t)e - peterS. - pseliger@gmx.net