Os módulos CommonJS permitem duas maneiras de definir propriedades exportadas. Em qualquer caso, você está retornando um objeto / função. Como as funções são cidadãos de primeira classe em JavaScript, elas podem agir exatamente como Objetos (tecnicamente, são Objetos). Dito isso, sua pergunta sobre o uso de new
palavras-chave tem uma resposta simples: sim. Vou ilustrar ...
Exportações de módulo
Você pode usar a exports
variável fornecida para anexar propriedades a ela. Uma vez exigidas em outro módulo, essas propriedades atribuídas tornam-se disponíveis. Ou você pode atribuir um objeto à propriedade module.exports. Em ambos os casos, o que é retornado por require()
é uma referência ao valor de module.exports
.
Um exemplo de pseudocódigo de como um módulo é definido:
var theModule = {
exports: {}
};
(function(module, exports, require) {
// Your module code goes here
})(theModule, theModule.exports, theRequireFunction);
No exemplo acima module.exports
e exports
são o mesmo objeto. A parte legal é que você não vê nada disso em seus módulos CommonJS, pois todo o sistema cuida disso para você, tudo o que você precisa saber é que existe um objeto de módulo com uma propriedade de exportação e uma variável de exportação que aponta para o mesma coisa que o module.exports faz.
Exigir com construtores
Uma vez que você pode anexar uma função diretamente a module.exports
você, pode essencialmente retornar uma função e, como qualquer função, ela poderia ser gerenciada como um construtor (está em itálico, pois a única diferença entre uma função e um construtor em JavaScript é como você pretende usá-lo. Tecnicamente não há diferença.)
Portanto, o código a seguir é perfeitamente bom e eu pessoalmente o encorajo:
// 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"
Exigir para não construtores
A mesma coisa vale para funções do tipo não construtor:
// My Module
exports.someFunction = function someFunction(msg) {
console.log(msg);
}
// In another module
var MyModule = require("./my_module.js");
MyModule.someFunction("foobar"); // => "foobar"
square
paraSquare
anew square()
não existir.