JavaScript Coding Patterns: Objekte & Objekt-Literale

Avatar von Norbert Schmidt

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 ObjekteFunktionen 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.

Weiter lesen und lernen!

Avatar von Norbert Schmidt

Kommentare

6 Antworten zu „JavaScript Coding Patterns: Objekte & Objekt-Literale“

  1. Lesenswert: JavaScript Coding Patterns: Objekte & Objekt-Literale http://t.co/oOJSY0dLCo

  2. JavaScript Coding Patterns: Objekte & Objekt-Literale http://t.co/7MZlvWKgXN via @mayflowerphp

  3. Avatar von Maximilian
    Maximilian

    Sehr informativer BlogBeitrag, der einem die Object-Literale noch einmal näher bringt. In JavaScript ist ja irgendwie alles ein Objekt.

    1. Ja, in JavaScript ist alles ein Objekt. Selbst für sogenannte primitive Datentypen wie Number, String und Boolean gibt es Objekt-Versionen.

      Übrigens, demnächst kannst Du hier einen weiteren Beitrag zum Thema JavaScript Coding Patterns lesen. Da geht es dann um Funktionen, die – wie soll es auch anders sein – in JavaScript ebenfalls Objekte sind.

  4. Zu wissen wie man die im Fazit beschriebenen Defizite vermeidet wäre von Vorteil.
    Das Module-Pattern könnte hilfreich sein:

    http://addyosmani.com/largescalejavascript/#modpattern

    var myFriends = (function() {
        var friends = []; // private
    
        // return public interface als objekt literal
        return {
            add: function(friend) {
                friends.push(friend);
            }
        };
    })(); // immediately invoked function expression
    
    1. Vielen Dank, Michael, für Deinen sehr interessanten Hinweis auf das Module Pattern! Dieses Pattern ist auf jeden Fall die Lösung für die Defizite, die einfache JavaScript-Objekte mit sich bringen.

      Und tatsächlich ist das Module Pattern ein Thema, mit dem ich mich im Mayflower-Blog bald ausführlicher beschäftigen werde.

      Zuvor wird es aber noch um den allgemeinen Stellenwert und die Anwendungsmöglichkeiten von Funktionen in JavaScript gehen, um Funktionen als First Class Objects, um Scope, um Closures und Immediate Functions.

      Bereits in ein paar Tagen gibt es hier einen Artikel dazu von mir und ich hoffe, dass Du Dich mit Deinem Feedback wieder einbringst.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert


Für das Handling unseres Newsletters nutzen wir den Dienst HubSpot. Mehr Informationen, insbesondere auch zu Deinem Widerrufsrecht, kannst Du jederzeit unserer Datenschutzerklärung entnehmen.