Hauptmenü

Untermenü

OOP/DOM-Scripting JavaScript - Praxistutorial 2 - array_keys

1. Die Abschnitte

2. Die Krux beim Prototyping

Im vorherigen Abschnitt habe ich euch gezeigt, wie Methoden beim Prototyping organisiert werden. Und ich habe auch darauf hingewiesen, dass es besonders beim Array-Objekt zu Problemen kommt. Und das zeige ich euch nun. Daher bauen wir uns mal die PHP-Funktion array_keys nach, die alle Indizes eines Arrays zurückliefert.

3. Die einfache Variante


Array.prototype.array_keys = function ()
{
  var tmp_key = new Array();
  for (var i in this)
  {    
    tmp_key.push(i); 
  }
  return tmp_key;
}
bla arr_3.array_keys();
alert (bla);

Erläuterung

Ich denke, dass diesen Code jeder von euch versteht. Oder verstehen sollte! Wir erzeugen ein "temporäres" Array namens tmp_arr und füllen es mit push um die jeweiligen Indizes (i). Allerdings sehen wir beim alert (bla); sofort, was passiert ist. Alle per prototype erzeugten Methoden erscheinen wie erwartet in unserem Array. Aber das wollen wir ja nicht.

4. Lösung 1

Im vorherigen Abschnitt habe ich euch schon gezeigt, dass typeof bei unseren Methoden ein function ergibt. Und das kann man sich zu Nutze machen. Bei folgendem Code erhält man tatsächlich nur die Indizes des gewünschten Arrays.


for (var i in this)
{      
  if ('function' != typeof this[i])
  {
    tmp_key.push(i); 
  } 
}

5. Lösung 2

Mein erster Gedanke war es, das mit einem regulären Ausdruck zu überprüfen, weil der "Wert" der "Array-Methode" immer mit function anfängt, also so.


for (var i in this)
{      
  if (!this[i].match(/^function/))
  {
    tmp_key.push(i); 
  }
}

Aber!!!

Sobald die erste Methode im Array erreicht ist, knallt es. Und warum? Ganz einfach, weil reguläre Ausdrücke nur auf Zeichenketten angewendet werden können. Der Typ der Methode ergibt aber function und da ist dann mit match hängen im Schacht.

So ist es richtig

Solltet ihr wirklich mal in die Situation kommen, in einem ähnlichen Fall mit regulären Ausdrücken arbeiten zu müssen, so werdet ihr um eine try-catch-Anweisung nicht herumkommen. Nutzt also im Normalfall eine Überprüfung mit typeof.


for (var i in this)
{      
  try
  {
    if (!this[i].match(/^function/))
    {
      tmp_key.push(i); 
    }
  }
  catch (e) { } 
}

zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt