molily: Objekt Instanzen speichern

Beitrag lesen

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