これまでのところ、私は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);
}
}
これは正しい方法でしょうか。
また、このクラスを自分のノードプロジェクト内の他のファイルにどのように公開するのですか。別のファイルで使用している場合でも、このクラスを拡張することはできますか?
私はあなたの何人かがこれらの質問に答えられることを願っています:)
はい、あなたの例はうまくいくでしょう。
クラスを公開することに関しては、他のものと同じようにクラスをexport
することができます。
class Animal {...}
module.exports = Animal;
または短いです:
module.exports = class Animal {
};
別のモジュールにインポートしたら、そのファイルで定義されているかのように扱うことができます。
var Animal = require('./Animal');
class Cat extends Animal {
...
}
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();
ES6のrequireの方法はimport
です。 import { ClassName } from 'path/to/ClassName'
syntaxを使用して、クラスをexport
にして他の場所にインポートすることができます。
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';
ノードでクラスを使う -
ここでは、ReadWriteモジュールが必要で、ReadWriteクラスのオブジェクトを返す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 を参照してください。