2017-01-28 4 views
3

Sehr geehrte alle Ich habe gerade angefangen, Module in Javascript zu lernen. Dies ist meine Implementierung eines Moduls:Wie exportiert man Funktionen in Module?

module.exports = function(logger_level) { 
    this.info = function(message) { 
     stdout(message); 
    }; 
}; 

function stdout(message) 
{ 
    process.stdout.write(message+'\n'); 
} 

und ich muss es aufrufen wie folgt aus:

var logger = require('./js/logger.js'); 
var logger1 = new logger("info1"); 

logger1.info("info"); 

Meine Frage ist, wie meine Implementierung des Moduls zu ändern, so dass ich es so berufen könnte :

var logger = require('./js/logger.js')("info"); 
logger.info("info"); 

Antwort

1

Sie suchen ein factory function suchen. Anwenden auf Ihren Anwendungsfall würde es wie aussehen:

module.exports = function(logger_level) { 
    return { 
     info: function(message) { 
      stdout(message); 
     } 
    }; 
}; 

function stdout(message) 
{ 
    process.stdout.write(message+'\n'); 
} 
1

Sie können Ihre Konstruktorfunktion mit einem Objekt wickeln und eine Instanz Ihrer Konstruktor Funktion zurückgeben

module.exports = { 

    return new function(logger_level) { 
     this.info = function(message) { 
      stdout(message); 
     }; 
    }; 

} 

Und nennen es

var logger = require('./js/logger.js'); 
logger.info("info"); 

Sie auch ein Singletonmuster mit einer einzigen Instanz des Konstruktorfunktion

2

arbeiten machen kann, wenn man es so nutzen wollen, gibt es keine Notwendigkeit für eine Konstruktorfunktion überhaupt:

module.exports = { 
    info: function(message) { 
     stdout(message); 
    } 
}; 

function stdout(message) 
{ 
    process.stdout.write(message+'\n'); 
} 

ich habe gerade angefangen Module in Javascript zu lernen.

Beachten Sie, dass dies nicht "Module in JavaScript" so viel wie "Module in NodeJS" ist. JavaScript-Module, die erst im ES2015 ("ES6") eingeführt wurden, sehen und verhalten sich ganz anders, sind aber noch nicht breit abgestützt. Wenn sie sind, könnte Ihr Modul wie folgt aussehen:

// ES2015+ syntax 
export default { 
    info: function(message) { 
     stdout(message); 
    } 
}; 

function stdout(message) 
{ 
    process.stdout.write(message+'\n'); 
} 

... und so benutzten:

import logger from './logger.js'; 
logger.info("info");