I moduli CommonJS consentono due modi per definire le proprietà esportate. In entrambi i casi stai restituendo un oggetto / funzione. Poiché le funzioni sono cittadini di prima classe in JavaScript, possono agire proprio come oggetti (tecnicamente sono oggetti). Detto questo, la tua domanda sull'utilizzo delle new
parole chiave ha una risposta semplice: sì. Illustrerò ...
Esporta il modulo
È possibile utilizzare la exports
variabile fornita per associarvi le proprietà. Una volta richieste in un altro modulo, quelle proprietà assegnate diventano disponibili. Oppure puoi assegnare un oggetto alla proprietà module.exports. In entrambi i casi ciò che viene restituito da require()
è un riferimento al valore di module.exports
.
Un esempio di pseudo-codice di come viene definito un modulo:
var theModule = {
exports: {}
};
(function(module, exports, require) {
// Your module code goes here
})(theModule, theModule.exports, theRequireFunction);
Nell'esempio sopra module.exports
e exports
sono lo stesso oggetto. La parte interessante è che non vedi nulla di tutto ciò nei tuoi moduli CommonJS poiché l'intero sistema si prende cura di questo per te tutto ciò che devi sapere è che c'è un oggetto modulo con una proprietà di esportazione e una variabile di esportazione che punta al stessa cosa fa il module.exports.
Richiedi con i costruttori
Dal momento che puoi allegare una funzione direttamente a module.exports
, puoi essenzialmente restituire una funzione e come qualsiasi funzione potrebbe essere gestita come un costruttore (è in corsivo poiché l'unica differenza tra una funzione e un costruttore in JavaScript è come intendi usarlo. non c'è differenza.)
Quindi il seguente è un codice perfettamente valido e personalmente lo incoraggio:
// 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"
Richiedi per i non costruttori
La stessa cosa vale per le funzioni non di tipo costruttore:
// My Module
exports.someFunction = function someFunction(msg) {
console.log(msg);
}
// In another module
var MyModule = require("./my_module.js");
MyModule.someFunction("foobar"); // => "foobar"
square
perSquare
lanew square()
non esiste più.