Según el manual de Node.js:
Si desea que la raíz de la exportación de su módulo sea una función (como un constructor) o si desea exportar un objeto completo en una asignación en lugar de construir una propiedad a la vez, asígnelo a module.exports en lugar de exportar .
El ejemplo dado es:
// file: square.js
module.exports = function(width) {
return {
area: function() {
return width * width;
}
};
}
y se usa así:
var square = require('./square.js');
var mySquare = square(2);
console.log('The area of my square is ' + mySquare.area());
Mi pregunta: ¿por qué el ejemplo no usa el cuadrado como objeto? ¿Es válido lo siguiente y hace que el ejemplo esté más "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
fuente
fuente
square
a ya no existe.Square
new square()
Respuestas:
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 devuelverequire()
es una referencia al valor demodule.exports
.Un ejemplo de pseudocódigo de cómo se define un módulo:
En el ejemplo anterior
module.exports
yexports
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:
Requerir para no constructores
Lo mismo ocurre con las funciones que no son de constructor:
fuente
En mi opinión, algunos de los ejemplos de node.js son bastante artificiales.
Puede esperar ver algo más parecido a esto en el mundo real.
Uso
Para la gente de ES6
Usándolo en ES6
Cuando use una clase, debe usar la
new
palabra clave para instalarla. Todo lo demás se queda igual.fuente
new
y no usarlo. Pero, ¿es solo porque tienes ese chequethis instanceof square
? Si es así, ¿qué está haciendo exactamente ese mecanismo?import
yexport
definidas? Estas son palabras clave reservadas en ECMAScript 6 (ES6). Antes de ES6, uno tenía que usar bibliotecas para administrar módulos. La modulación del nodo se basa en los módulos de la biblioteca CommonJS. ¿Qué es eldefault
enexport default Square
? Esto especifica qué importar cuando solo importa el 'archivo' y no otras exportaciones específicas de ese archivo. Durante el tiempo que existen, me encontré con estas páginas de ayuda: spring.io/understanding/javascript-modules y exploringjs.com/es6/ch_modules.htmlEsta pregunta realmente no tiene nada que ver con cómo
require()
funciona. Básicamente, lo que sea que establezcamodule.exports
en su módulo será devuelto por larequire()
llamada.Esto sería equivalente a:
No es necesario
new
utilizar la palabra clave al llamarsquare
. No está devolviendo la instancia de la función en sísquare
, está devolviendo un nuevo objeto al final. Por lo tanto, puede simplemente llamar a esta función directamente.Para obtener argumentos más complejos
new
, consulte lo siguiente: ¿Se considera dañina la palabra clave "nueva" de JavaScript?fuente
new
que otros puedan participar en la guerra allí.El código de ejemplo es:
en principal
usar lo siguiente puede funcionar
fuente
Al final, Node trata sobre Javascript. JS tiene varias formas de lograr algo, es lo mismo obtener un "constructor", lo importante es devolver una función .
De esta manera, en realidad, está creando una nueva función, como la que creamos usando JS en el entorno del navegador web, por ejemplo.
Personalmente prefiero el enfoque del prototipo, como sugirió Sukima en esta publicación: Node.js - uso de module.exports como constructor
fuente