201113Okt

JavaScript++: Erweiterte Möglichkeiten im C-Stil

Mit Backbone, Angular oder Agility stehen bereits interessante Möglichkeiten bereit, um in JavaScript eine objektorientierte Architektur mit MVC-Charakter zu implementieren. Die Existenz solcher Bibliotheken liegt zum einen in der Tatsache, dass JavaScript in erster Linie für unkomplizierte Operationen auf Client-Seite ausgelegt wurde und zum anderen unterscheidet sich die Grundidee hinter JavaScript (z.B. durch lose Typisierung und Prototypen) von klassischen Programmiersprachen.
Um dennoch die Vorzüge und Eigenschaften von Sprachen wie Java oder C++ auch in JavaScript nutzen zu können, bedarf es der manuellen Erweiterung. Dies kann durch Module, Parser oder Converter erreicht werden. Eine Bibliothek, die komplexeren JavaScript-Code ermöglicht und ES3-kompatiblen Code ausgibt, stellt JavaScript++ dar. Das Projekt bietet eine ganze Reihe von objektorientierten Erweiterungen, wie man sie aus bekannten Programmiersprachen kennt.

JavaScript++ - New, Powerful Language for Better Web Development

Dazu zählen Klassen (samt Konstruktoren und Destruktoren), Vererbung, Zugriffsbeschränkungen (private, public, protected), statische Methoden oder Overloading. Zudem werden PCRE-Expressions unterstützt. Für groß angelegte und skalierbare JavaScript-Anwendungen dürfte JavaScript++ eine interessante Möglichkeit sein. Folgende Konstrukte sind also möglich:

  • class foo {
  • class bar {
  • private var baz = 100;
  • public function() {
  • return [baz];
  • }
  • }
  •  
  • public function() {
  • return new bar();
  • }
  • }
  •  
  • new foo();

Der Code muss im finalen Schritt nur noch durch den mitgelieferten Parser konvertiert werden. JavaScript++ steht hier zum Download bereit und befindet sich derzeit noch in einer Alpha-Version.

Kommentare

Maik K schrieb am 19.10.2011 #1

Ich finde hier passiert genau das, was der gute Doug Crockford immer anmahnt: Die Leute denken, weil JavaScript aussieht wie C-Code, muss er auch so funktionieren. Aber was JS so großartig macht, ist doch gerade das, wie es funktioniert. Nested Classes z.B. – die gibt es doch schon, schließlich ist alles in JavaScript grundsätzlich erstmal ein Objekt und was spricht denn gegen folgenden Code? (Wäre cool, wenn es in den Kommentaren nen pre-Tag oder etwas ähnliches gäbe, so ist es etwas unleserlich.. :/ )

<script>
var foo = { bar: { xyz: 123, abc: function () { alert('bar') } }, foo: function(a,b,c) { console.log('test'); }
}
</script>

Das Problem ist nicht JS, denn JS ist eine wunderbare Sprache. Das Problem sind eher die Nutzer, die aus einer C-ähnlichen Sprache zu JavaScript kommen – diese verstehen bestimmte Eigenschaften der Sprache einfach falsch oder garnicht.

Ich kann mich erinnern, das Crockford vor einer Weile mal zum Thema gesprochen hat, den Vortrag gibts glaube ich auch noch auf Youtube – auf jeden Fall sehr empfehlenswert.

Matthias schrieb am 19.10.2011 #2

JavaScript hat seine Vorzüge und generell finde ich das Modell der Prototypen/Objekte sehr gut. Zusammen mit der losen Typisierung wird JavaScript dadurch erst richtig flexibel und das eröffnet eine ganz andere Herangehensweise.

Projekte wie JavaScript++ dienen in meinen Augen Entwicklern, die andere Sprachen gewöhnt sind, wo die "Objektorientierung" eben auf eine andere Weise funktioniert. Das heißt nicht, dass JavaScript das unbedingt nachahmen sollte, aber nützlich kann es schon sein.

Dustin Diaz bietet hier ziemlich gute Ansätze, gerade wenn es um die Simulation von Interfaces oder Vererbung geht. Solche Komponenten fehlen eben in JavaScript und wie würdest Du in Deinem Beispiel etwa die Variable "foo.bar.xyz" als "private" kennzeichnen? Von außen ist sie erreichbar und kann damit verändert werden. Bei Projekten, an denen mehrere Entwickler arbeiten, ist das nicht immer gewünscht.

Beide Stile haben ihre Vor- und Nachteile. In JavaScript können gewünschte Aspekte auch ohne JavaScript++ umgesetzt werden – dann kommen eben Konstrukte wie "arguments.callee.prototype" zum Einsatz ;-) Es ist dann wohl einfach Geschmackssache.

Code-Blöcke müssten jetzt auch mit "pre.." möglich sein :-)