Entonces, hasta ahora, he creado clases y módulos de node.jsla siguiente manera:
var fs = require('fs');
var animalModule = (function () {
/**
* Constructor initialize object
* @constructor
*/
var Animal = function (name) {
this.name = name;
};
Animal.prototype.print = function () {
console.log('Name is :'+ this.name);
};
return {
Animal: Animal
}
}());
module.exports = animalModule;
Ahora, con ES6, puede crear clases "reales" como esta:
class Animal{
constructor(name){
this.name = name ;
}
print(){
console.log('Name is :'+ this.name);
}
}
Ahora, en primer lugar, me encanta esto :) pero plantea una pregunta. ¿Cómo se usa esto combinado con node.jsla estructura del módulo de '?
Supongamos que tiene una clase en la que desea utilizar un módulo por motivos de demostración, digamos que desea utilizar fs
para que crees tu archivo:
Animal.js
var fs = require('fs');
class Animal{
constructor(name){
this.name = name ;
}
print(){
console.log('Name is :'+ this.name);
}
}
¿Sería esta la forma correcta?
Además, ¿cómo expones esta clase a otros archivos dentro de mi proyecto de nodo? ¿Y aún podría extender esta clase si la usa en un archivo separado?
Espero que algunos de ustedes puedan responder estas preguntas :)
javascript
node.js
ecmascript-6
Marc Rasmussen
fuente
fuente

animalModuletiene sentido en un módulo de nodo que tiene su propio alcance de módulo de todos modos.Respuestas:
Sí, tu ejemplo funcionaría bien.
En cuanto a exponer sus clases, puede
exportuna clase como cualquier otra cosa:O el más corto:
Una vez importado a otro módulo, puede tratarlo como si estuviera definido en ese archivo:
fuente
module.exportsse utiliza normalmente para una exportación anónima, mientras queexportse utiliza para una exportación con nombre. Esta es una cortesía de codificación básica (podría decirse), que puede ayudar a otros a saber cómo importar su clase, módulo, etcétera.module.exports = Animal;sería la respuesta o el equivalente más directo a la pregunta y es válido junto con elconst Animal = require('./animal');código de llamada. ¿Puede actualizar su respuesta para incluirla?Simplemente trate el nombre de la clase ES6 de la misma manera que hubiera tratado el nombre del constructor en la forma ES5. Son uno y lo mismo.
La sintaxis de ES6 es simplemente azúcar sintáctica y crea exactamente el mismo prototipo subyacente, función de constructor y objetos.
Entonces, en su ejemplo de ES6 con:
Puede tratarlo
Animalcomo el constructor de su objeto (lo mismo que lo hubiera hecho en ES5). Puede exportar el constructor. Puede llamar al constructor connew Animal(). Todo es igual para usarlo. Solo la sintaxis de la declaración es diferente. Incluso todavía hay unAnimal.prototypeque tiene todos tus métodos. La forma ES6 realmente crea el mismo resultado de codificación, solo que con una sintaxis más elegante / agradable.En el lado de la importación, esto se usaría así:
Este esquema exporta el constructor Animal como la
.Animalpropiedad que le permite exportar más de una cosa de ese módulo.Si no necesita exportar más de una cosa, puede hacer esto:
Y luego importarlo con:
fuente
module.exports = Animales la única solución que funciona.require()de lo que muestra su exportación, por lo que sería por eso que uno funcionaría y el otro no. Debe hacer coincidir cómo funciona la importación con cómo se define la exportación. Más detalles para explicar esto se agregaron a mi respuesta.La forma de ES6 de require es
import. Puedeexportsu clase e importarla en otro lugar usando laimport { ClassName } from 'path/to/ClassName'sintaxis.fuente
The ES6 wayes algo engañoso.importoverrequiresolo por el bien de la coherencia de sintaxis.importinteropera con los módulos CommonJS no es probable que termine funcionando en Node, por lo que podría requerir cambios de código en el futuro para ser compatible con Node sin Babel. .Usando clases en el nodo -
Aquí estamos solicitando el módulo ReadWrite y llamando a makeObject (), que devuelve el objeto de la clase ReadWrite. Que estamos usando para llamar a los métodos. index.js
ReadWrite.js
Aquí hacemos un método makeObject, que asegura que se devuelva un objeto, solo si un objeto no está disponible.
Para obtener más explicaciones, vaya a https://medium.com/@nynptel/node-js-boiler-plate-code-using-singleton-classes-5b479e513f74
fuente
En el archivo de clase, puede usar:
o puedes usar esta sintaxis
Por otro lado, para usar esta clase en cualquier otro archivo, debe seguir estos pasos. Primero requiere ese archivo usando esta sintaxis:
const anyVariableNameHere = require('filePathHere');Luego crea un objeto
const classObject = new anyVariableNameHere();Después de esto, puede usar
classObjectpara acceder a las variables de clase realesfuente