Axel Richter: 'Klassen' und Events pro 'Instanz'

Beitrag lesen

Hallo,

Im Moment probiere ich nur herum, wie man anständige, wiederverwendbare Objekte mit JavaScript schreibt.

Gar nicht? *scnr*

Damit JavaScript als OOP-Sprache funktioniert, fehlt die klare Trennung zwischen Klassen und Objekten, also Instanzen. Diese existiert nur bei den vorgefertigten Objekten (Image, Array ...) und in den vorgefertigten Interfaces (HTMLElement, HTMLCollection ...). Selbst erstellte "Objekte" sind/müssen ja, zum Zeitpunkt des Erzeugens mit dem new-Operator, bereits als Objekte (Funktionen) im Arbeitsspeicher vorhanden sein. New kopiert dann einfach nur noch das vorhandene Objekt (Prototyp-Funktion) in eine neue Variable.

Folgendes Beispiel zeigt dies und auch, wie hier "this" zu verstehen ist. Nach dem Kopieren des Prototyps mit "new" erbt die Objektvariable alle Eigenschaften und Funktionen, die der Prototyp mit "this" freigibt.

<html>
<head>
<title>HTML test</title>
<script type="text/javascript">
function extendedElement(elm) {
 //Prototypbeschreibung
 var private = "geheim"; //eine private-Eigenschaft
 var element = elm;
 var echo = function() {
  alert( "Object: " + element.tagName + "\n" + "value: " + element.value + "\n" + "type: " + element.type + "\n" + "style.width: " + element.style.width + "\n" + private);
 }
 element.onmouseover = echo;

//veröffentlichte "Eigenschaft"
 this.element = element;

//veröffentlichte "Methode"
 this.echo = echo;
}
</script>
</head>
<body>
<h1 id="a">Ueberschrift</h1>
<p><input id="b" value="A" maxlength="10" style="width:300px;"></p>
<p><input id="c" type="button" value="B" style="width:30px;"></p>
<p id="d" style="width:100px;">Textabsatz</p>
<script type="text/javascript">
var eA = new extendedElement(document.getElementById("a"));
var eB = new extendedElement(document.getElementById("b"));
var eC = new extendedElement(document.getElementById("c"));
//veröffentlichte Eigenschaften/Methoden aufrufen:
alert(eC.element.value);
eC.echo();

//alert(eC.private); //Fehler

extendedElement(document.getElementById("d"));
</script>
</body>
</html>

viele Grüße

Axel