Beim Programmieren mit JavaScript steht einem nicht immer ein Framework zur Verfügung. Auch lohnt sich der Einsatz eines solchen Hilfsmittels nicht immer, da schließlich auch viel Kleinkram mit JavaScript zu programmieren ist. Also macht es doch Sinn, sich ein paar Gedanken zum Thema JavaScript Coding Patterns zu machen.
In einer objektorientierten und funktionalen Programmiersprache wie JavaScript sie ist, spielen selbstverständlich Objekte, Funktionen und Vererbung die Hauptrolle bei der effizienten und sinnvollen Strukturierung von Code. Entlang dieser zentralen Sprachelemente haben sich Coding Patterns herausgebildet, von denen ich in diesem ersten Teil einer Artikel-Serie den Einsatz des Objekt-Literals als Mittel zur Code-Organisation vorstellen werde.
Übersichtlichkeit und Transparenz durch Objekt-Literale
Objekt-Literale bieten eine wirklich sehr, sehr einfache und gute Möglichkeit JavaScript-Code übersichtlich und transparent zu strukturieren. Erzeuge ich ein Objekt per Literal, definiere ich im Rahmen einer bestimmten Syntax direkt die Attribute des Objektes:
var person = { name: 'Willy', age: 56, gender: 'male' };
Objekte sind in JavaScript keine Instanzen von Klassen (als Baupläne für Objekte aufgefasst), sondern immer ganz konkrete Objekte. JavaScript ist eine klassenlose Sprache. Objekte stellen hier dynamische, jederzeit veränderbare, Datenstrukturen aus Schlüssel-Wert-Paaren dar. Damit erinnern JavaScript-Objekte stark an assoziative Arrays oder Hashtabellen, die es in JavaScript zwar nicht gibt, aber mit Objekt-Literalen nachgeahmt werden können. Eine Unterscheidung zwischen Attributen und Methoden eines Objektes existiert nicht. Eine Objekteigenschaft kann aber ohne Probleme eine Funktion sein, die dann als Methode des Objektes benutzt werden kann. Der Wert, der einem Schlüssel zugeordnet wird, darf übrigens alles sein, was in JavaScript als Datentyp zugelassen ist:
var myFriends = { friends: []; howMany: 0, features: { rich: true, generous: true, maxAge: 99, gender: 'both' }, add: function (name) { return this.howMany = this.friends.push(name); }, remove: function (name) { var index = this.friends.indexOf(name); if (index !== -1) { this.friends.splice(index, 1); return this.howMany = this.friends.length; } } };
Namensräume schaffen
Statt also Variablen und Funktionen ohne jeden Zusammenhang im Code zu verstreuen, definiert man sie als Eigenschaften eines per Literal erstellten Objektes. Man schafft so einen Namensraum für zusammengehörige Teile. Im oben gezeigten Beispiel ist nur noch das Objekt myFriends im globalen Scope angesiedelt. Alle darunter angeordneten Attribute und Methoden sind nur über myFriends zu erreichen. Deshalb löst ein direkter Zugriff auf die Methode remove() einen Error aus:
myFriends.howMany; // 0 myFriends.add('Willy'); // 1 remove('Willy'); // 'ReferenceError: remove is not defined'
Objekt-Hierarchien
Auch eine Rangordnung von Objekten lässt sich mit Literalen leicht und klar ersichtlich herstellen, wie das folgende Beispiel verdeutlicht:
var application = { name: 'Awesome Application', version: 'v0.1.0', init: function () { return this.name + ' was launched successfully!'; } }; application.moduleOne = { name: 'Module One', version: 'v0.0.2', init: function () { return this.name + ' was loaded successfully!'; }, provideAppInfo: function () { return this.name + ' is part of the ' + application.name + '!'; } }; application.moduleOne.provideAppInfo(); // 'Module One is part of the Awesome Application!'
Fazit
Objekt-Literale bilden lediglich das Minimum an Struktur, welche man JavaScript-Code geben sollte. Wirklich komplexe Zusammenhänge lassen sich nur schlecht oder gar nicht abbilden. Ein großes Defizit besteht darin, dass alle Attribute und Methoden eines einfachen Objektes ohne Einschränkungen direkt zugänglich sind. Sowohl innerhalb der Objekt-Struktur als auch von außerhalb.
Im folgenden zweiten Teil der Reihe Javascript Coding Patterns beschäftige ich mich mit den Möglichkeiten die Closures und Immediate Functions bieten, um die Unzulänglichkeiten von einfachen Objekten im Hinblick auf komplexere Code-Organisation auszugleichen.
Schreibe einen Kommentar