Stellen wir uns vor, Webentwickler würden anstatt Programmiersprachen Fremdsprachen sprechen: Englisch könnten wir, aber Französisch brauchen wir jetzt leider für unser neues Projekt.
Ganz logisch: Das mit den lateinischen Buchstaben kennen wir ja bereits, syntaktische Schnörksel wie Gravis sind unnötiger Codesmell und allgemein ist die Grammatik ja ziemlich komisch (bestes Beispiel “Grand Prix Eurovision de la Chanson Européenne” – das ist doch viel mehr Tipparbeit als Eurovision Song Contest und sagt das gleiche). Also nimmt man doch lieber alles was man nicht kennt aus der Sprache raus und erfindet seine eigenes, smarteres Französisch, das halt französische Wörter nimmt, aber vom Aufbau an Englisch angelehnt ist. Englisch ist ziemlich bekannt und ausserdem genauso feature complete, das macht die Sache für andere auch einfacher. Und für die Franzosen (die nicht in der Lage sind, unser besseres Französisch zu sprechen) schreibt man dann bei der eigentlichen Kommunikation einfach das schnieke Französisch 2.0 in das bloated Französisch 1.0 um, damit die auch was verstehen.
Klingt komisch? Willkommen in der Welt von JavaScript. Nach CoffeeScript hat jetzt Microsoft seinen Entwurf für ein ‘besseres’ JavaScript herausgebracht. Hauptargument: Vererbung und Objekte in JavaScript sind ja schwer zu handeln. Leider stimmt das seit ECMAScript 5 dank Object.create nicht mehr ganz (und das wird mittlerweile von einer ganzen Reihe Browser unterstützt), nur ist es da anders als man es gewohnt ist. Daher ein kleiner Exkurs in ECMAScripts ‘neue’ Objektmethoden:
Die Methode:

Object.create(parent,properties)

Erstellt in ECMAScript 5 ein neues Objekt,d das von parent erbt und die Eigenschaften aus properties besitzt. Z.b. würde:

 var Hund = Object.create(Animal,{ name: { value: 'Hund', writable: false } }) 

Ein Objekt Hund erstellen, das von Animal erbt und “Hund.name” würde einfach “Hund” zurückgeben. Was jetzt wirklich neu ist: Durch das writable: false werden sämtliche Versuche, Hund.name zu überschreiben ignoriert. Es gibt neben value und writable aber noch weitere praktische Attribute, nämlich:

  • enumerable: Gibt an ob die Eigenschaft bei einer for..in Schleife über das Objekt erscheint
  • get: Sehr praktisch: Ruft eine Funktion beim lesenden Zugriff auf die Eigenschaft auf, anstatt einfach nur einen wert zurückzugeben.
  • set: Ebenfalls praktisch: Ruft beim schreibenden Zugriff auf die Eigenschaft eine Funktion auf, anstatt einfach den Wert in die Eigenschaft zu schreiben
  • configurable: Definiert, dass die Konfiguration der Eigenschaft nicht verändert werden darf
Mit Object.defineProperty(objekt,name,properties) kann man auch nachträglich Eigenschaften an ein Objekt hinzufügen (z.B. für komplexere Methoden).

Man sieht also gleich, dass es hier ganz neue Sprachfeatures und nicht nur syntaktische Neuanordnungen gibt. Die sind zwar nicht ganz das sind, was man von der Objektorientierung her kennt (wo ist das ‘class’ Schlüsselwort?), aber JavaScript ist halt auch kein Java.
Zusätzlich dazu gibt es noch zwei praktische Methoden um Änderungen an Objekten zu verhindern:

  • Object.preventExtensions(Hund): Verhindert, dass man mit defineProperty Eigenschaften nachträglich an Hund hinzufügt
  • Object.seal(Hund) : Hier könnte man die Objektstruktur von Hund nicht mehr verändern
  • Object.freeze(Hund) : Hier kann man auch vorhandene (und auf writable gesetzte) Eigenschaften des Objektes nicht mehr ändern

Die Features werden von allen neueren Browsern (IE9+,FF4+, Chrome 5+, Opera 11.60+) unterstützt, für ältere gibt es bei Modernizr einen Polyfill.
Ich finde zwar z.B. Typescript eine ganz nette Sache und wirklich gut gemacht (gerade für JS Neulinge aus der Java/C# Welt). Allerdings würde ich persönlich mir wünschen dass mehr Energie in die bessere Unterstützung von ‘echtem’ JavaScript in IDEs gesteckt wird, anstatt andauernd das Rad neu zu erfinden. Am Ende interpretieren die Browser dann doch JavaScript – und das ist jetzt nicht so komplex oder aufwändig als dass man auf Zwischeninterpreter angewiesen ist um ein Projekt In-Time durchzubekommen. Immerhin gibt es auch gute (und kleine!) Bibliotheken, die einem das Leben erleichtern, wenn die Sprache einem doch Probleme bereitet.
Wer mehr zu den Objekt.* Methoden lesen will: