Hallo,
var widgets = new Object();
widgets[dom_elem] = new MeinWidget(dom_elem, ... );
Echte Hashes in JavaScript (ECMAScript 5.1) gibt es nicht. Objekte können als Hashes verwendet werden, haben aber immer String-Schlüssel. Erst in kommenden ECMAScript-Versionen gibt es Hashes mit Objekten als Schlüssel geben. (Die können sich übrigens ruhig ändern – die Identität des Objektes bleibt ja dieselbe.)
Derzeit kann man einen Array mit den Instanzen pflegen. Anstatt direkt den Konstruktor zu verwenden, würde ich eine create-Funktion schreiben, die entweder die existierende Instanz zurückgibt oder eine neue erzeugt:
~~~javascript
MeinWidget.instances = [];
MeinWidget.create = function (element) {
var instances = MeinWidget.instances;
// Suche nach bestehender Instanz
for (var i = 0, l = instances.length; i < l; i++) {
var instance = instances[i];
// Angenommen, das Element wird in der Eigenschaft »element« gespeichert
if (instance.element == element) {
// Gebe bestehende Instanz zurück
return instance;
}
}
// Erzeuge neue Instanz
var widget = new MeinWidget(element);
MeinWidget.instances.push(element);
return widget;
};
var widget = createMeinWidget(document.getElementById('foo'));
Das Konzept nennt sich Identity Map. Genau genommen könnte man obigen Code auch im Konstruktor notieren, weil dieser ein beliebiges Objekt zurückgeben kann, nicht notwendig die jüngst erzeugte Instanz. Gemäß dem »Prinzip der geringsten Überraschung« würde ich das aber wie oben in einer gesonderten Methode umsetzen. Diese kann man wie oben an der Konstruktorfunktion speichern – in anderen Programmiersprachen »statische Methode« oder »Klassenmethode« genannt – oder in einer davon unabhängigen Methode.
Grüße,
Mathias