Facebook
Twitter
Google+
Kommentare
0

MrbJs: Automatic Namespaces in Javascript (JS-Goodies Part I)

In Javascript selbst gibt es keine direkten Namensräume, wie bspw. in PHP oder auch C. Jedoch können Objekte so verschachtelt werden, dass derartige Anforderungen auch automatisiert generiert werden.

Da ich wie man sieht ein Fable für Javascript habe, möchte ich euch in der Reihe JS-Goodies ein paar sehr nützliche Funktionen bzw. Erweiterungen vorstellen. Denn gerade in der Entwicklung mit Javascript, ist es wichtig, dass Tools oder auch Frameworks viel Arbeit abnehmen.

Wie man dem Titel entnehmen kann, geht es im ersten Teil rund um die Namenräume. Diese sind sehr einfach umzusetzen. Ziel ist es, später mit der folgenden Anweisung die nervige Kontrolle auf das Globale Objekt zu vermeiden:

Mrb.namespace('Mrb.Registry', {});

So wäre ein leeres Objekt für Mrb.Registry gesetzt und könnte nun erweitert werden. Natürlich kann man auch statt dem leeren Objekt ein bereits fertiges oder auch eine Funktion übergeben.

Ohne eine derartige Funktion benötigt man folgende Anweisung:

(function(scope) {

    scope.Mrb = scope.Mrb || {};
    var Mrb = scope.Mrb;

    Mrb.Registry = { };

}(window));

Man spart jedoch nicht nur an der Schreibarbeit, sondern schafft es dadurch auch, die Flexibilität, als auch Erweiterbarkeit und natürlich nicht zuletzt, die Übersichtlichkeit zu waren.

Doch wie funktioniert das Ganze? Eigentlich relativ einfach. Im Grunde wird die Funktion Mrb.namespace() nur solange aufgerufen, bis alle Daten im globalen Objekt stehen. Hierfür wird zunächst der erste Parameter mit split(‘.’) geteilt.

Mrb.namespace = function(namespace, append) {
    if (typeof namespace !== 'string') {
        throw 'Es wurde kein valider Namensraum übergeben.';
    }

    if (typeof append !== 'object'
        && typeof append !== 'function'
    ) {
        append = {};
    }

    var parts = namespace.split('.'),
        parent = null;

    if (typeof Mrb.global[parts[0]] === 'undefined') {
        Mrb.global[parts[0]] = {};
        parent = Mrb.global[parts[0]];
    } else {
        parent = Mrb.global[parts[0]];
    }

    parts = parts.slice(1);

    Mrb.each(parts, function(key, value, isLast) {
        if (typeof parent[value] === 'undefined') {
            if (isLast === true) {
                parent[value] = append;
            } else {
                parent[value] = {};
            }
        }

        parent = parent[value];
    });

    return Mrb;
};

Weiterführend: Mrb.each();

Und so könnte ein Anwendungsfall aussehen:

Mrb.ns('App.sayHello', function(name) {
        return 'Hello, ' + name + '.';
});

console.log(App.sayHello('Marc'));

Alle hier geschriebenen Beiträge zu MrbJs bzw. zu den JS-Goodies findet man auch auf Github.com.
Jetzt zu MrbJs auf Github.

Den nächsten Beitrag in JS-Goodies könnt ihr selbst bestimmen:

  • Automatisches Laden von Javascript Dateien (Use/Require Pattern)
  • Public / Private Variablen in Javascript
  • Javascript Design Patterns: Factory
  • Javascript Design Patterns: Singleton
  • Javascript Design Patterns: Proxy
  • Javascript Design Patterns: Observer
Über den Autor

MrBoolean

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen