Tag Archives: JavaScript

Vererbung mit JavaScript

In einer Vorlesung wurde das Konzept der Vererbung grundlegend erläutert und in einer Übungsaufgabe illustriert, wie das in prototypbasierten Sprachen aussehen kann. Wir sollten meine alte Freundin JavaScript mit dem Interpreter von Mozilla benutzen. Subtyping und Vererbung ist für JavaScript wohl nur ansatzweise und unbehände gelöst; zahlreiche Quellen im Web führten mich zu Lösungen, die als Prototyp eines Subtyps ein Object des Supertyps setzten. Das sah in etwa so aus:

function Person(name) {
  var name = name;
  this.print = function() {
    print(name);
  }
}
Person.prototype = new Person("A");

function Student(name, id) {
  Person.prototype.constructor(name);
  var id = id;
  this.print = function() {
    Person.prototype.print();
    print(id);
  }
}
Student.prototype = new Person("B");

Die Notation mit den Prototypen ist ziemlich unhandlich — und auch nicht korrekt. Read more »

Mehr Spaß mit JavaScript

Was ist das mit dieser Sprache? Man findet im Web mehrere Stellen, die die Existenz einer solche Schleife in JavaScript postulieren:

for each ( element in array ) {
  ...
}

Die Tatsache, dass das Syntaxhighlighting das each nicht hervorhebt, hätte mich stutzig machen müssen. Später stellte ich fest, dass eine solche Schleife auf einem k-elementigen Array k+1 Mal durchlaufen wird, zuletzt mit element === null. Heute komme ich durch einen Hinweis von Frank darauf, dass doch tatsächlich Opera diese Schleifen gar nicht kennt.

Also bin ich meinen Code durchgegangen und habe alle for-each-Schleifen durch gute alte Zählschleifen ersetzt, kein Problem soweit. Nur, dass nun auf einmal Endlosschleifen auftraten. Ich kann das Problem an meinem Code nicht mehr reproduzieren, aber es lag wohl ein Fehler dieser Art vor. Was ist das für eine Sprache bzw. ein Interpreter, die bzw. der sowas erlaubt?!

Jedenfalls steht jetzt in jeder Schleifen ein var, und das ist auch gut so. Arg.

Probleme mit der Gültigkeit von Variablen in JavaScript

Bei meinem aktuellen Bastelprojekt habe ich mich in die Tiefen von AJAX gestürzt. Ich hab schon viel geflucht, aber das hier ist die Krönung.

Man stelle sich vor, man möchte an einer Reihe von gleichartigen Elementen Listener registrieren, sodass an jedem Element eine leicht veränderte Aktion ausgeführt wird. Das geht zum Beispiel mit prototype an sich ziemlich einfach. Es kommt unter Umständen folgener Code heraus (der hier natürlich auf das Essentielle vereinfacht ist):

for ( i=0; i<4; i++ ) {
  var j = 2*i;
  $('button_' + i).observe('click', function (event) { alert(j); });
}

Dieses unschuldige Stückchen Code hat aber nicht den gewünschten Effekt. Jeder Button meldet ’6′. Das ist verwirrend, denn jeder Button bekommt seine eigene Funktion, die von einem Wert abhängt, der ganz sicher auch nur für die Konstruktion dieser einen Funktion benutzt wird. Natürlich muss j nach Ende jeder Iteration weiterleben, damit die anonym definierte Funktion einen sinnvollen Kontext hat. Letztenendes muss es also vier Instanzen von j geben, die alle die Schleife überdauern.
Ich vermute, dass der Interpreter meint, zu optimieren, indem er j immer wieder überschreibt. In vielen Fällen mag das sinnvoll sein, wenn j nämlich nach Ende einer Iteration tatsächlich nicht mehr lebt. Hier sind aber wirklich vier Instanzen nötig.

Man kann das nun in den Griff bekommen, indem man zum Beispiel so arbeitet:

for ( i=0; i<4; i++ ) {
  var j = 2*i;
  $('button_' + i).observe('click', clicked(j));
}

function clicked(i) {
  return function(event) { alert(i); };
}

Ist das ein Bug von Javascript oder nur von Firefox (3.0.8) oder ist das ein Feature und ich bin zu dämlich?

Codebeispiele hier.