必須のNode.js ES6クラス


103

だから今まで、私はnode.js次の方法でクラスとモジュールを作成しました:

    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;

ES6を使用すると、次のように「実際の」クラスを作成できます。

class Animal{

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

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

さて、まず第一に、私はこれが大好きです:)しかし、それは質問を引き起こします。これをnode.jsのモジュール構造とどのように組み合わせて使用​​しますか?

デモのためにモジュールを使用したいクラスがあるとします。 fs

だからあなたはあなたのファイルを作成します:


Animal.js

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

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

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

これは正しい方法でしょうか?

また、このクラスを私のノードプロジェクト内の他のファイルにどのように公開しますか?また、別のファイルで使用している場合でも、このクラスを拡張できますか?

あなたの何人かがこれらの質問に答えられるようになることを願っています:)


3
ES6のクラス名は、ES5の方法でコンストラクター名を扱ったのと同じように扱ってください。彼らは同じです。ES6の構文は単なる構文上の砂糖であり、まったく同じ基本的なプロトタイプ、コンストラクター関数、およびオブジェクトを作成します。
jfriend00

あなたを作成するそのIIFE animalModuleは、とにかく独自のモジュールスコープを持つノードモジュールではかなり無意味です。
Bergi

回答:


156

はい、あなたの例はうまくいきます。

クラスの公開についてはexport、他のクラスと同じようにクラスを使用できます。

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

またはより短い:

module.exports = class Animal {

};

別のモジュールにインポートすると、そのファイルで定義されているかのように処理できます。

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

class Cat extends Animal {
    ...
}

8
module.exports = class Animal {}のようなこともできます
Paul

それは本当です、割り当ての間にあなたが物事に名前を付けることができることを忘れません。
rossipedia

それは、コードのスタイルと明確さによって決まります。module.exports通常は匿名エクスポートにexport使用され、名前付きエクスポートに使用されます。これは基本的なコーディングの礼儀(言うかもしれません)であり、クラスやモジュールなどをインポートする方法を他の人が理解するのに役立ちます。
greg.arnott 2017

7
module.exports = Animal;質問に対する答えまたは最も直接的な同等物でありconst Animal = require('./animal');、呼び出しコードで有効です。回答を更新して含めることができますか?

1
おかげで、私はクラスのインポートが2時間ほど正しく機能するように取り組んできました。
kiwicomb123 2018

11

ES6のクラス名は、ES5の方法でコンストラクター名を扱ったのと同じように扱ってください。彼らは同じです。

ES6の構文は単なる構文上の砂糖であり、まったく同じ基本的なプロトタイプ、コンストラクター関数、およびオブジェクトを作成します。

したがって、ES6の例では次のようになります。

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

var a = new Animal();

module.exports = {Animal: Animal};

Animalオブジェクトのコンストラクタのように扱うことができます(ES5で行ったのと同じです)。コンストラクタをエクスポートできます。でコンストラクタを呼び出すことができますnew Animal()。使い方はすべて同じです。宣言の構文のみが異なります。でも、まだありますAnimal.prototype、それの上のすべてのごメソッドを持っています。ES6の方法では、より洗練された構文で、同じコーディング結果が実際に作成されます。


インポート側では、これは次のように使用されます。

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

let a = new Animal();

このスキームは、.Animalそのモジュールから複数のものをエクスポートできるプロパティとして、Animalコンストラクターをエクスポートします。

複数のものをエクスポートする必要がない場合は、これを行うことができます。

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

module.exports = Animal;

そして、それをインポートします:

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

let a = new Animal();

理由はわかりませんが、うまくいきませんでした。module.exports = Animal機能する唯一のソリューションです。
サム

1
@Sam-エクスポートで表示されるrequire()内容は、エクスポートで表示される内容とは異なる必要があるため、一方が機能し、もう一方が機能しないのはそのためです。インポートの動作とエクスポートの定義を一致させる必要があります。これを説明する詳細が私の回答に追加されました。
jfriend00

5

ES6でのrequireの方法はですimportexportクラスを作成し、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';

4
これはオプションではあるが要件ではないことを明確にするとよいでしょう。これはES6モジュールの構文ですが、Nodeの通常のCommonJSエクスポートでES6クラスを使用できます。クラスでES6エクスポート構文を使用する必要はありません。それを呼び出すことThe ES6 wayはやや誤解を招くものです。
loganfsmyth 2017年

2
それは本当です、それは個人的な好みです。個人的には、構文の一貫性のためだけに使用importrequireます。
ファンジン

2
確かにそれはしっかりしたアプローチであり、私も同じですimport。BabelがCommonJSモジュールと相互運用する方法がNodeで機能するようになる可能性は低いので、BabelなしのNodeと互換性を保つには、将来コードの変更が必要になる可能性があります。 。
loganfsmyth 2017年

4
ES6モジュール(インポートとエクスポート)はノード10でもまだ実験
段階であり、

@dorkingのポイントに追加します。ノード10.15.3はLTS(長期サポート)バージョンであり、2020年4月まで有効
gtzilla

1

ノードでのクラスの使用-

ここでは、ReadWriteモジュールを必要とし、ReadObjectクラスのオブジェクトを返すmakeObject()を呼び出しています。メソッドの呼び出しに使用しているもの。 index.js

const ReadWrite = require('./ReadWrite').makeObject();
const express = require('express');
const app = express();

class Start {
  constructor() {
    const server = app.listen(8081),
     host = server.address().address,
     port = server.address().port
    console.log("Example app listening at http://%s:%s", host, port);
    console.log('Running');

  }

  async route(req, res, next) {
    const result = await ReadWrite.readWrite();
    res.send(result);
  }
}

const obj1 = new Start();
app.get('/', obj1.route);
module.exports = Start;

ReadWrite.js

ここでは、オブジェクトが使用できない場合にのみオブジェクトが返されることを確認するmakeObjectメソッドを作成します。

class ReadWrite {
    constructor() {
        console.log('Read Write'); 
        this.x;   
    }
    static makeObject() {        
        if (!this.x) {
            this.x = new ReadWrite();
        }
        return this.x;
    }
    read(){
    return "read"
    }

    write(){
        return "write"
    }


    async readWrite() {
        try {
            const obj = ReadWrite.makeObject();
            const result = await Promise.all([ obj.read(), obj.write()])
            console.log(result);
            check();
            return result
        }
        catch(err) {
            console.log(err);

        }
    }
}
module.exports = ReadWrite;

詳細については、https://medium.com/@nynptel/node-js-boiler-plate-code-using-singleton-classes-5b479e513f74にアクセスしてください


0

クラスファイルでは、次のいずれかを使用できます。

module.exports = class ClassNameHere {
 print() {
  console.log('In print function');
 }
}

または、この構文を使用できます

class ClassNameHere{
 print(){
  console.log('In print function');
 }
}

module.exports = ClassNameHere;

一方、他のファイルでこのクラスを使用するには、これらの手順を実行する必要があります。まず、この構文を使用してそのファイルを要求します。 const anyVariableNameHere = require('filePathHere');

次にオブジェクトを作成します const classObject = new anyVariableNameHere();

この後classObject、実際のクラス変数にアクセスするために使用できます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.