124 votes

Node.js ES6 classes avec require

Jusqu'à maintenant, j'ai créé des classes et des modules en node.js la façon suivante:

    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;

Maintenant, avec ES6, vous êtes en mesure de faire "réelle" des classes comme ceci:

class Animal{

 constructor(name){
    this.name = name ;
 }

 print(){
    console.log('Name is :'+ this.name);
 }
}

Maintenant, tout d'abord, j'adore :) mais il se pose une question. Comment utilisez-vous ce combiné avec node.jss'module structure?

Disons que vous avez une classe où vous souhaitez utiliser un module pour le bien de la démonstration de dire que vous souhaitez utiliser, fs

donc, vous créez votre fichier:


Animal.js

var fs = require('fs');
class Animal{

 constructor(name){
    this.name = name ;
 }

 print(){
    console.log('Name is :'+ this.name);
 }
}

Serait-ce la bonne manière?

Aussi, comment voulez-vous exposer cette classe à d'autres fichiers à l'intérieur de mon nœud de projet? Et voulez-vous toujours être en mesure d'étendre cette classe si vous l'utilisez dans un fichier séparé?

J'espère que certains d'entre vous seront en mesure de répondre à ces questions :)

189voto

rossipedia Points 10922

Oui, votre exemple fonctionnerait bien.

Pour exposer vos classes, vous pouvez export une classe comme n'importe quoi d'autre:

 class Animal {...}
module.exports = Animal;
 

Ou le plus court:

 module.exports = class Animal {

};
 

Une fois importé dans un autre module, vous pouvez le traiter comme s'il était défini dans ce fichier:

 var Animal = require('./Animal');

class Cat extends Animal {
    ...
}
 

16voto

jfriend00 Points 152127

Seulement traiter le ES6 nom de la classe est la même que pour avoir traité le constructeur nom dans l'ES5. Ils sont un et le même.

L'ES6 syntaxe est juste sucre syntaxique et crée exactement le même sous-jacent prototype, le constructeur de la fonction et des objets.

Donc, dans votre ES6 exemple avec:

// animal.js
class Animal {
    ...
}

var a = new Animal();

module.exports = {Animal: Animal};

Vous pouvez considérer Animal comme le constructeur de votre objet (le même que vous auriez fait dans l'ES5). Vous pouvez exporter le constructeur. Vous pouvez appeler le constructeur new Animal(). Tout est la même chose pour l'utiliser. Seule la syntaxe de déclaration est différente. Il y a même encore un Animal.prototype qui a toutes vos méthodes. L'ES6 façon vraiment créer le même codage résultat, juste avec amateur/plus belle la syntaxe.


Du côté des importations, ce serait alors être utilisée comme ceci:

const Animal = require('./animal.js').Animal;

let a = new Animal();

Ce schéma, les exportations de l'Animal constructeur comme l' .Animal de la propriété qui vous permet d'exporter plus d'une chose à partir de ce module.

Si vous n'avez pas besoin d'exporter plus d'une chose, vous pouvez le faire:

// animal.js
class Animal {
    ...
}

module.exports = Animal;

Et puis de l'importer avec:

const Animal = require('./animal.js');

let a = new Animal();

6voto

Fan Jin Points 957

La manière dont ES6 est requis est import . Vous pouvez export votre classe et l'importer ailleurs en utilisant la syntaxe import { ClassName } from 'path/to/ClassName' .

 import fs from 'fs';
export default class Animal {

  constructor(name){
    this.name = name ;
  }

  print(){
    console.log('Name is :'+ this.name);
  }
}

import Animal from 'path/to/Animal.js';
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X