peterS.: Objekthierarchien selbst definieren

Beitrag lesen

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