Pakete und Klassen in Javascript

Immer wieder werde ich gefragt, ob man in Javascript – analog zu Java – seinen Quellcode auch in Klassen und Pakete strukturieren kann. Von Hause aus bringt Javascript dazu leider keine Werkzeuge mit. Daher muss man sich einiger Hilfsmittel bedienen.

Um ein Paket zu definieren, erstellt man zunächst eine Variable mit dem Namen des Paketes. Anschießend reicht man diese Variable an einen neuen Scope weiter.

var MyPackage;
(function (MyPackage) {

    ...

})(MyPackage|| (MyPackage = {}));

Um nun Klassen innerhalb eines solchen Paketes zu definieren, wird ein weiterer Scope innerhalb des Paketes erstellt, welcher einer Variablen zugewiesen wird. Entsprechend des unten stehenden Beispiels können somit private und öffentliche Klassen mit entsprechenden Methoden erstellt werden. Das erste Beispiel zeigt eine nicht öffentliche Klasse, die nur innerhalb des Scopes verfügbar ist.

var MyPackage;
(function (MyPackage) {

    var PrivateClass = (function () {

        function PrivateClass() {
        }

        var myPrivateMethod = function () {
            alert('I am a private method in the private class.');
        };

        PrivateClass.prototype.myPublicMethod = function () {
            alert('I am a public method in the private class.');
            myPrivateMethod();
        };

        return PrivateClass;

    })();

})(MyPackage || (MyPackage = {}));

Die folgende Klasse ist innerhalb des Paketes verfügbar und somit öffentlich zugänglich.

var MyPackage;
(function (MyPackage) {
    MyPackage.PublicClass = (function () {

        function PublicClass() {
        }

        PublicClass.prototype.myPublicMethod = function () {
            alert('I am a method in a public class.');
        };

        return PublicClass;

    })();

})(MyPackage || (MyPackage = {}));

Außerhalb des Paketes kann man nur Klassen aufrufen, die als öffentlich definiert worden sind.

if (MyPackage) {
    var publicClass = new MyPackage.PublicClass();
    publicClass.myPublicMethod();
} else {
    alert('MyPackage is not defined!');
}

Dadurch hat man nun auch die Möglichkeit seine Javascript-Klassen – analog zu Java – auf mehrere Dateien zu verteilen und somit eine bessere Übersicht über den Quellcode zu haben.

Schreibe einen Kommentar