Selon le manuel Node.js:
Si vous souhaitez que la racine de l'exportation de votre module soit une fonction (comme un constructeur) ou si vous souhaitez exporter un objet complet dans une affectation au lieu de le construire une propriété à la fois, affectez-le à module.exports au lieu d'exporter .
L'exemple donné est:
// file: square.js
module.exports = function(width) {
return {
area: function() {
return width * width;
}
};
}
et utilisé comme ceci:
var square = require('./square.js');
var mySquare = square(2);
console.log('The area of my square is ' + mySquare.area());
Ma question: pourquoi l'exemple n'utilise-t-il pas le carré comme objet? Est-ce que ce qui suit est valide et rend-il l'exemple plus "orienté objet"?
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
la source
la source
square
àSquare
lanew square()
plus existe.Réponses:
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é parrequire()
est une référence à la valeur demodule.exports
.Un exemple de pseudo-code de la façon dont un module est défini:
Dans l'exemple ci
module.exports
- dessus etexports
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:
Exiger pour les non-constructeurs
Même chose pour les fonctions comme les non-constructeurs:
la source
À mon avis, certains des exemples de node.js sont assez artificiels.
Vous pourriez vous attendre à voir quelque chose de plus comme ça dans le monde réel
Usage
Pour les personnes ES6
Utilisation dans ES6
Lorsque vous utilisez une classe, vous devez utiliser le
new
mot - clé pour l'instaurer. Tout le reste demeure inchangé.la source
new
et ne pas l'utiliser. Mais est-ce uniquement parce que vous avez ce chèquethis instanceof square
? Dans l'affirmative, que fait exactement ce mécanisme?import
etexport
définies? Ce sont des mots clés réservés dans ECMAScript 6 (ES6). Avant ES6, il fallait utiliser des bibliothèques pour gérer les modules. La modulation de Node est calquée sur les modules de la bibliothèque CommonJS. Quel est ledefault
dansexport default Square
? Cela spécifie ce qu'il faut importer lorsque vous importez simplement le «fichier» et pas d'autres exportations spécifiques à partir de ce fichier. Aussi longtemps qu'ils existent, j'ai trouvé ces pages utiles: spring.io/understanding/javascript-modules et exploringjs.com/es6/ch_modules.htmlCette question n'a vraiment rien à voir avec le
require()
fonctionnement. Fondamentalement, tout ce que vous définissezmodule.exports
dans votre module sera renvoyé par l'require()
appel.Ce serait équivalent à:
Il n'y a pas besoin du
new
mot - clé lors de l'appelsquare
. Vous ne renvoyez pas l'instance de fonction elle-mêmesquare
, vous renvoyez un nouvel objet à la fin. Par conséquent, vous pouvez simplement appeler cette fonction directement.Pour des arguments plus complexes
new
, consultez ceci: Le «nouveau» mot-clé de JavaScript est-il considéré comme dangereux?la source
new
que les autres puissent participer à la guerre là-bas.L'exemple de code est:
en général
l'utilisation de ce qui suit peut fonctionner
la source
À la fin, Node parle de Javascript. JS a plusieurs façons d'accomplir quelque chose, c'est la même chose pour obtenir un "constructeur", l'important est de renvoyer une fonction .
De cette façon, en fait, vous créez une nouvelle fonction, comme nous l'avons créée à l'aide de JS sur l'environnement de navigateur Web par exemple.
Personnellement, je préfère l'approche prototype, comme Sukima l'a suggéré sur ce post: Node.js - utilisation de module.exports comme constructeur
la source