Les modules CommonJS permettent de définir les propriétés exportées de deux manières. Dans les deux cas, vous renvoyez un objet / une fonction. Parce que les fonctions sont des citoyens de première classe en JavaScript, elles peuvent agir comme des objets (techniquement, ce sont des objets). Cela dit, votre question sur l'utilisation des new
mots - clés a une réponse simple: Oui. Je vais illustrer ...
Exportations de modules
Vous pouvez utiliser la exports
variable fournie pour lui attacher des propriétés. Une fois requis dans un autre module, ces propriétés attribuées deviennent disponibles. Ou vous pouvez affecter un objet à la propriété module.exports. Dans les deux cas, ce qui est renvoyé par require()
est une référence à la valeur de module.exports
.
Un exemple de pseudo-code de la façon dont un module est défini:
var theModule = {
exports: {}
};
(function(module, exports, require) {
// Your module code goes here
})(theModule, theModule.exports, theRequireFunction);
Dans l'exemple ci module.exports
- dessus et exports
sont le même objet. La partie intéressante est que vous ne voyez rien de tout cela dans vos modules CommonJS car tout le système s'en charge pour vous.Tout ce que vous devez savoir, c'est qu'il existe un objet module avec une propriété exports et une variable exports qui pointe vers le même chose que module.exports fait.
Exiger avec les constructeurs
Puisque vous pouvez attacher une fonction directement à module.exports
vous, vous pouvez essentiellement renvoyer une fonction et comme toute fonction, elle pourrait être gérée en tant que constructeur (c'est en italique puisque la seule différence entre une fonction et un constructeur en JavaScript est la façon dont vous avez l'intention de l'utiliser. Techniquement il n'y a pas de différence.)
Le code suivant est donc parfaitement bon et je l'encourage personnellement:
// 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"
Exiger pour les non-constructeurs
Même chose pour les fonctions comme les non-constructeurs:
// My Module
exports.someFunction = function someFunction(msg) {
console.log(msg);
}
// In another module
var MyModule = require("./my_module.js");
MyModule.someFunction("foobar"); // => "foobar"
square
àSquare
lanew square()
plus existe.