NodeJS-export-Klasse mit statischen Methoden
Ich versuche, entwickeln eine Klasse mit statischen Methoden, die auf einer NodeJs-Anwendung, wie eine Config-Modul Zweck.
Ich möchte Zugriff von verschiedenen Modulen instanziieren, ohne jedes mal ein neues Objekt.
1) Ist es richtig, einen Ansatz verwenden, wie unten beschrieben, die Vermeidung der Klasse prototype?
function Config(){
}
Config.svrPort=function(){
return 8080;
}
Config.dbName=function(){
return "myDbName";
}
module.exports = Config;
2) gibt es andere Lösungen?
3) Ist es auch ein Gültiger Ansatz, um unterschiedliche Objekte, die im selben Modul (z.B. config.js) wie das?
exports.server=function(){
return{
port:8080
};
};
exports.database=function(){
return{
name:"myDbName",
user:"root",
password:"myPassword",
host:"localhost",
port:3306
};
};
und schließlich, es zu benutzen als:
var config = require('./config');
config.server().port
config.database().name
- warum nicht einfach ein Objekt-literal?
- Das ist der richtige Ansatz, obwohl in deinem Beispiel könnte man einfach die Werte zu speichern als primitive:
Config.SVR_PORT = 8080
beachten Sie auch, schrieb ich diejenigen, die als "Konstanten", die seit ich weiß nicht empfehlen, änderung der Statik. - Ich Stimme mit @dev-null. Verwenden Sie einfach
var Config = {SVG_PORT: 8080, ...}
. Sie können auchObject.freeze
. - Der letztere Ansatz ist gültig. Für die erste kann man nur
mode.exports = new Config()
, also nicht setzen Sie den Konstruktor.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dass ist der richtige Ansatz, obwohl in deinem Beispiel könnte man einfach die Werte zu speichern als primitive:
Config.SVR_PORT = 8080
, Hinweis, schrieb ich die als "Konstanten", die seit ich weiß nicht empfehlen, änderung der Statik.Wenn das gesagt wird, dann bitte beachten: nicht legen Sie keine sensiblen Daten (Passwörter, etc.) in Ihrem JavaScript-Dateien, sondern setzen Sie diese in einer config-Datei. Dies wird die separate Konfiguration von code. Und helfen Sie nicht zu lecken, jede mögliche kritische Informationen.
db-Geheimnisse.json
Dann können Sie Zugriff auf die Geheimnisse, indem ein wrapper-Modul:
Oder machen Sie einen db-connect-Modul
db-connect.js
:Wenn Sie mithilfe von git für die Quellcodeverwaltung können Sie ganz einfach fügen Sie den folgenden, um Ihre
.gitignore
die machen sicher, dass Ihre sensiblen Datei nicht Hinzugefügt git:.gitignore
JS unterstützt object-literalen, nicht zu erwähnen, dass Sie können exportieren Sie ein einzelnes Objekt oder mehrere export-Eigenschaften auf die Standard -
exports
Objekt... Wenn dierequire('./your-module');
passiert Sie den code in das Modul nicht laufen wieder, es gibt einfach die Originale exportieren, dass hat seinen eigenen ursprünglichen Kontext.Exportieren Sie einfach die einzelnen Funktionen/Variablen, die Sie wollen, wie ein Objekt-literal, oder an der Exporte.
Den code eigentlich nur einmal ausgeführt und an allen Orten Verwendung finden Sie unter der gleichen option.
Als beiseite, wenn Sie mit Babel mit ES6-Module, können Sie einfach erklären, Ihren export mit jeder Methode...
Gibt es keine Klassen in der Prototyp-Sprachen (es ist nur ein syntax-Zucker, imitiert die klassische OOP). Daher keine statischen Methoden. Meine Vermutung ist, dass Sie möchten, dass ein singleton (das ist das gleiche wie
object literal
).Object.create
?required
, ein neues Objekt ist erstellt. Wenn Sie nicht möchten, dass dieses Verhalten, ersetzen Sie einfachObject.create(Config)
mitConfig
. Wie Sie einen Wert aus der get (falls ich die Frage richtig verstanden), nicht zu verhängen ein neues Objekt erstellen.required
zum ersten mal, der Wert wird zwischengespeichert werden. Auch ich sehe nicht den Punkt derObject.create
hier.require()
passiert das selbe Objekt zurückgegeben... sind Sie besser dran, einfach den Export der einzigartigen Objekt.obj = {}; Object.create(obj) === obj; // is true
?require('foo') === require('foo')
.. der code nicht erneut ausführen, benötigen wieder die gleichen Exporte, die bereits verarbeitet ... auch, es gibt keinen Punkt, mit dem Objekt.erstellen Sie in diesem Fall.