De acordo com o manual do Node.js:
Se você deseja que a raiz da exportação do seu módulo seja uma função (como um construtor) ou se deseja exportar um objeto completo em uma atribuição em vez de construí-lo com uma propriedade por vez, atribua-o a module.exports em vez de exportações .
O exemplo dado é:
// file: square.js
module.exports = function(width) {
return {
area: function() {
return width * width;
}
};
}
e usado assim:
var square = require('./square.js');
var mySquare = square(2);
console.log('The area of my square is ' + mySquare.area());
Minha pergunta: por que o exemplo não usa o quadrado como objeto? O seguinte é válido e torna o exemplo mais "orientado a objetos"?
var Square = require('./square.js');
var mySquare = new Square(2);
console.log('The area of my square is ' + mySquare.area());
javascript
node.js
commonjs
Naresh
fonte
fonte
square
paraSquare
anew square()
não existir.Respostas:
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 porrequire()
é uma referência ao valor demodule.exports
.Um exemplo de pseudocódigo de como um módulo é definido:
No exemplo acima
module.exports
eexports
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:
Exigir para não construtores
A mesma coisa vale para funções do tipo não construtor:
fonte
Na minha opinião, alguns dos exemplos de node.js são bastante artificiais.
Você pode esperar ver algo mais parecido com isso no mundo real
Uso
Para as pessoas ES6
Usando no ES6
Ao usar uma classe, você deve usar a
new
palavra-chave para instatá-la. todo o resto permanece o mesmo.fonte
new
e não usá-lo. Mas, isso é apenas porque você tem aquele chequethis instanceof square
? Em caso afirmativo, o que exatamente esse mecanismo está fazendo?import
eexport
definidas? Essas são palavras-chave reservadas em ECMAScript 6 (ES6). Antes do ES6, era necessário usar bibliotecas para gerenciar módulos. A modulação do Node é modelada a partir dos Módulos da biblioteca CommonJS. O que estádefault
dentroexport default Square
? Isso especifica o que importar quando você apenas importa o 'arquivo' e não outras exportações específicas desse arquivo. Para contanto que eles existem, eu achei estas páginas votos: spring.io/understanding/javascript-modules e exploringjs.com/es6/ch_modules.htmlEsta questão realmente não tem nada a ver com como
require()
funciona. Basicamente, tudo o que você definirmodule.exports
em seu módulo será retornado darequire()
chamada para ele.Isso seria equivalente a:
Não há necessidade de
new
palavra - chave ao chamarsquare
. Você não está retornando a própria instância da funçãosquare
, está retornando um novo objeto no final. Portanto, você pode simplesmente chamar essa função diretamente.Para obter argumentos mais complexos
new
, verifique isto: A palavra-chave "nova" do JavaScript é considerada prejudicial?fonte
new
que outros possam participar da guerra sobre ele lá.O código de exemplo é:
no principal
usar o seguinte pode funcionar
fonte
No final, Node é sobre Javascript. JS tem várias maneiras de fazer algo, é a mesma coisa de pegar um "construtor", o importante é retornar uma função .
Desta forma na verdade você está criando uma nova função, como criamos usando JS no ambiente Web Browser por exemplo.
Pessoalmente, eu prefiro a abordagem de protótipo, como Sukima sugeriu neste post: Node.js - uso de module.exports como um construtor
fonte