it-swarm.com.ru

Классы Node.js ES6 с требованием

Итак, до сих пор я создавал классы и модули в 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);
 }
}

Будет ли это правильный путь?

Кроме того, как вы предоставляете этот класс другим файлам в моем проекте узла? И вы все еще сможете расширить этот класс, если используете его в отдельном файле?

Я надеюсь, что некоторые из вас смогут ответить на эти вопросы :)

75
Marc Rasmussen

Да, ваш пример будет работать нормально.

Что касается показа ваших классов, вы можете export класс, как и все остальное:

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

Или короче

module.exports = class Animal {

};

После импорта в другой модуль вы можете обращаться с ним так, как если бы он был определен в этом файле:

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

class Cat extends Animal {
    ...
}
107
rossipedia

Просто обработайте имя класса 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();
7
jfriend00

Способ ES6 требует import. Вы можете export вашего класса и импортировать его в другое место, используя import { ClassName } from 'path/to/ClassName'syntax.

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';
3
Fan Jin

Использование классов в Node -

Здесь нам требуется модуль ReadWrite и вызывается makeObject (), который возвращает объект класса ReadWrite. Который мы используем для вызова методов. 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
Nayan Patel