static-Eigenschaften in JavaScript

Standard

Ich spiele gerade ein wenig mit Node.js herum. Es dauerte eine Weile, bis ich verstanden habe, wie man in JavaSrcipt static Eigenschaften einer Klasse abbilden kann. Der Hintergrund war, dass ich Werte für Konfigurationen der Applikation in einer Klasse speichern wollte, um sie überall im Programm-Code zur Verfügung zu haben. In C++ hätte ich das so abgebildet, indem ich eine Klasse definiere, deren Eigenschaften „static“ sind. Wo immer ich dann im Code eine solche Klasse initialisiere, sind ihre Werte die selben.

In JavaScript lassen sich Klassen-Eigenschaften jedoch nicht mit „static“ deklarieren. Stattdessen arbeitet man mit so genannten „prototype“. Jedes SavaScript hat eine Eigenschaft „prototype“. Wird in diesen Namensraum eine Eigenschaft angelegt, gilt sie für alle Objekte die von der selben Klassen-Type sind. Zur Verdeutlichung ein kurzes Beispiel:

var AppConfig = function AppConfig(){};
AppConfig.prototype.filename = "config-file.json"
AppConfig.prototype.db = {
    host: "localhost",
    port: "9999"
};

var app_config = new AppConfig();
module.exports = app_config;

Zunächst wird mit der ersten Zeile ein Constructor für die Klasse „AppConfig“ definiert. Das würde in C++ so ausgedrückt.

class AppConfig {
    public:
         AppConfig(){};
}

Der nächste Schritte fügt der Klasse eine neue Static-Eigenschaft hinzu. Das wiederum würde in C++ etwa so aussehen:

class AppConfig {
    public:
        AppConfig(){};
        static std::string filename;
};

AppConfig::AppConfig(): filename(„config-file.json“){ }

In der Zeile darunter sieht man, wie komplexere Daten-Strukturen angelegt werden. In der vorletzten Zeile wird die Klasse instantiiert. Die letzte Zeile ist ein Konstrukt das benötigt wird, um die Klasse in einem Node.js-Projekt zu verwenden. Mit dieser Zeile kann die Klasse überall hin importiert werden:

var app_config = require('./app_config.js');

Wo immer eine Instanz dieser Klasse verwendet wird, haben deren Eigenschaften die gleichen Werte (jedenfalls alle Prototype-Eigenschaften). Auf diese Weise kann man sich das mühsame Durchreichen von Werten über Methoden-Parameter ersparen.