Los módulos CommonJS permiten dos formas de definir propiedades exportadas. En cualquier caso, está devolviendo un objeto / función. Debido a que las funciones son ciudadanos de primera clase en JavaScript, pueden actuar como Objetos (técnicamente son Objetos). Dicho esto, su pregunta sobre el uso de new
palabras clave tiene una respuesta simple: sí. Te ilustraré ...
Exportaciones de módulos
Puede utilizar la exports
variable proporcionada para adjuntarle propiedades. Una vez que se requieran en otro módulo, esas propiedades de asignación estarán disponibles. O puede asignar un objeto a la propiedad module.exports. En cualquier caso, lo que devuelve require()
es una referencia al valor de module.exports
.
Un ejemplo de pseudocódigo de cómo se define un módulo:
var theModule = {
exports: {}
};
(function(module, exports, require) {
// Your module code goes here
})(theModule, theModule.exports, theRequireFunction);
En el ejemplo anterior module.exports
y exports
son el mismo objeto. Lo bueno es que no ve nada de eso en sus módulos CommonJS, ya que todo el sistema se encarga de eso, todo lo que necesita saber es que hay un objeto de módulo con una propiedad de exportación y una variable de exportación que apunta a la lo mismo que hace module.exports.
Requerir con constructores
Dado que puede adjuntar una función directamente module.exports
, esencialmente puede devolver una función y, como cualquier función, podría administrarse como un constructor (eso está en cursiva, ya que la única diferencia entre una función y un constructor en JavaScript es cómo pretende usarlo. Técnicamente no hay diferencia.)
Entonces, el siguiente es un código perfectamente bueno y personalmente lo recomiendo:
// 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"
Requerir para no constructores
Lo mismo ocurre con las funciones que no son de constructor:
// My Module
exports.someFunction = function someFunction(msg) {
console.log(msg);
}
// In another module
var MyModule = require("./my_module.js");
MyModule.someFunction("foobar"); // => "foobar"
square
a ya no existe.Square
new square()