Mit CommonJS-Modulen können exportierte Eigenschaften auf zwei Arten definiert werden. In beiden Fällen geben Sie ein Objekt / eine Funktion zurück. Da Funktionen in JavaScript erstklassige Bürger sind, können sie sich wie Objekte verhalten (technisch gesehen sind sie Objekte). Ihre Frage zur Verwendung der new
Schlüsselwörter hat jedoch eine einfache Antwort: Ja. Ich werde veranschaulichen ...
Modulexporte
Sie können entweder die exports
bereitgestellte Variable verwenden, um Eigenschaften daran anzuhängen. Sobald diese Zuweisungseigenschaften in einem anderen Modul erforderlich sind, werden sie verfügbar. Oder Sie können der Eigenschaft module.exports ein Objekt zuweisen. In beiden Fällen require()
wird ein Verweis auf den Wert von zurückgegeben module.exports
.
Ein Pseudocode-Beispiel für die Definition eines Moduls:
var theModule = {
exports: {}
};
(function(module, exports, require) {
// Your module code goes here
})(theModule, theModule.exports, theRequireFunction);
Im obigen Beispiel module.exports
und exports
sind das gleiche Objekt. Der coole Teil ist, dass Sie nichts davon in Ihren CommonJS-Modulen sehen, da das gesamte System sich darum kümmert. Alles, was Sie wissen müssen, ist, dass es ein Modulobjekt mit einer Exporteigenschaft und einer Exportvariablen gibt, die auf das zeigt das gleiche macht das module.exports.
Mit Konstruktoren anfordern
Da Sie eine Funktion direkt anhängen können, können module.exports
Sie im Wesentlichen eine Funktion zurückgeben und wie jede Funktion als Konstruktor verwalten. (Dies ist kursiv dargestellt, da der einzige Unterschied zwischen einer Funktion und einem Konstruktor in JavaScript darin besteht, wie Sie sie verwenden möchten. Technisch es gibt keinen Unterschied.)
Folgendes ist also ein perfekter Code, und ich persönlich ermutige ihn:
// My module
function MyObject(bar) {
this.bar = bar;
}
MyObject.prototype.foo = function foo() {
console.log(this.bar);
};
module.exports = MyObject;
// In another module:
var MyObjectOrSomeCleverName = require("./my_object.js");
var my_obj_instance = new MyObjectOrSomeCleverName("foobar");
my_obj_instance.foo(); // => "foobar"
Für Nichtkonstruktoren erforderlich
Gleiches gilt für nicht konstruktorähnliche Funktionen:
// My Module
exports.someFunction = function someFunction(msg) {
console.log(msg);
}
// In another module
var MyModule = require("./my_module.js");
MyModule.someFunction("foobar"); // => "foobar"
square
in existiertSquare
dasnew square()
nicht mehr.