objektorientierte Programmierung in node js
Ich habe eine grundlegende Frage wie folgt:
Ich habe 2 separate Module main.js und logger.js im selben Verzeichnis. die logger.js ist einfach:
function Logger(){
return this;
};
Logger.prototype.log = function(str) {
console.log('[' + this.mPrefix + ']' + str);
};
Logger.prototype.init = function(pr){
this.mPrefix = pr;
}
module.exports = Logger;
Nun, ich will mein logger im main-Modul wie dieses:
var logger = require('./logger.js');
logger.init('MAIN');
logger.log('foo');
Aber Knoten besteht darauf, dass Logger
hat keine Methode mit dem Namen init
oder log
. Ich habe auch versucht require('./logger.js')()
, da bin ich übergeben Sie eine Funktion die Rücksendung selbst-Objekt, aber es hat nicht geholfen. Was ist die beste Praxis für die Objekte definieren, die in anderen Modulen und Sie zu exportieren? Durch die Art und Weise, geschieht Es, um durch dies zu tun:
var logger = require('./logger.js');
var l = new logger();
l.init('MAIN');
l.log('bar');
Aber es scheint ungeschickt zu mich. Alle Erklärungen & Vorschläge?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie einen Konstruktor, das ist, was
prototype
ist für. Wenn Sie möchten, eine global logger-Objekt, müssen Sie zum exportieren einer globalen logger-Objekt:Alternativ können Sie exportieren einer Instanz von
Logger
:Ist eine minimale Veränderung, die geändert wird minimal, falls Sie jemals tun möchten, setzen Sie den Konstruktor.
Wenn Sie tatsächlich wollen, erstellen Sie mehrere
Logger
Instanzen, sind Sie stecken mit einer Konstruktor – aber keine Sorge, es ist eine gute Sache. Sie können ersetzeninit
mit dem Konstruktor zu.und
require
caches, und es gibt nicht viel Sie tun können.module.exports = new Logger()
.require
caches, die ist, warum ich sagte, Sie haben eine harte Zeit, es zu tun auf andere Weise. Aber warum nicht ein Konstruktor? Das ist, was es ist.mysql.connect(connectionInfo, function(err, connection) { … });
– aber das ist, weil Sie asynchron.In JavaScript
function Logger() {}
definiert den Konstruktor oder Ihr Objekt. (Sie wollen nicht zurückthis
aus dem Konstruktor, übrigens.)Und ja, hätte Sie erstellen eine Instanz des Objekts für den Zugriff auf die Funktionen, die Sie bestimmt im Prototypen des Objekts.
Verstecken die logger-Klasse könnte man auch eine "statische" Objekt von etwas wie dies:
Nun würden Sie anrufen
Logger.getLogger()
einer neuen Instanz.Und btw. Lesen Sie diese, um erfahren Sie mehr über JavaScript Objekte