Node.js ES6 sınıfları gerektirir


104

Şimdiye kadar node.jsaşağıdaki şekilde sınıflar ve modüller oluşturdum :

    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;

Artık ES6 ile şu şekilde "gerçek" sınıflar oluşturabilirsiniz:

class Animal{

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

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

Şimdi, her şeyden önce, bunu seviyorum :) ama bir soruyu gündeme getiriyor. Bunu node.jsmodül yapısıyla birlikte nasıl kullanıyorsunuz ?

Gösteri amacıyla bir modülü kullanmak istediğiniz bir sınıfınız olduğunu varsayalım, kullanmak istediğinizi söyleyin. fs

böylece dosyanızı yaratırsınız:


Animal.js

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

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

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

Bu doğru yol olur mu?

Ayrıca, bu sınıfı düğüm projemdeki diğer dosyalara nasıl açıklarsınız? Ayrı bir dosyada kullanıyorsanız, bu sınıfı yine de genişletebilir misiniz?

Umarım bazılarınız bu soruları cevaplayabilir :)


3
ES6 sınıf adını, kurucu adını ES5 yöntemiyle ele aldığınız gibi ele alın. Onlar bir ve aynı. ES6 sözdizimi sadece sözdizimsel şekerdir ve tamamen aynı temel prototipi, yapıcı işlevi ve nesneleri oluşturur.
jfriend00

animalModuleKendi modül kapsamına sahip bir düğüm modülünde , sizi oluşturan IIFE oldukça anlamsız.
Bergi

Yanıtlar:


160

Evet, örneğiniz iyi sonuç verir.

Derslerinizi ifşa etmeye gelince, exporther şey gibi bir sınıf yapabilirsiniz :

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

Veya daha kısa olanı:

module.exports = class Animal {

};

Başka bir modüle aktarıldıktan sonra, onu o dosyada tanımlanmış gibi ele alabilirsiniz:

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

class Cat extends Animal {
    ...
}

8
Ayrıca module.exports = class Animal {}
Paul

bu doğru, görev sırasında bazı şeyleri isimlendirebileceğini unutup duruyorum.
rossipedia

Kod stili ve netliğine bağlıdır. module.exportsgenellikle anonim bir dışa aktarma exportiçin kullanılırken, adlandırılmış bir dışa aktarma için kullanılır. Bu, başkalarının sınıfınızı nasıl aktaracaklarını bilmelerine yardımcı olabilecek temel bir kodlama nezaketidir (söyleyebilirsiniz), modül ve diğerleri vb.
greg.arnott

7
module.exports = Animal;sorunun cevabı veya en doğrudan eşdeğeri olacaktır ve const Animal = require('./animal');çağrı koduyla birlikte geçerlidir . Cevabınızı içerecek şekilde güncelleyebilir misiniz?
Pazar

1
Teşekkürler dostum, yaklaşık 2 saattir sınıf ithalatlarının düzgün çalışmasıyla mücadele ediyorum.
kiwicomb123

11

ES6 sınıf adını, kurucu adını ES5 yöntemiyle ele aldığınız gibi ele alın. Onlar bir ve aynı.

ES6 sözdizimi sadece sözdizimsel şekerdir ve tamamen aynı temel prototipi, yapıcı işlevi ve nesneleri oluşturur.

Öyleyse, ES6 örneğinizde:

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

var a = new Animal();

module.exports = {Animal: Animal};

Sadece davranabilirsiniz Animalsenin nesnenin kurucusu (siz ES5 içinde yapardı aynı) gibi. Yapıcıyı dışa aktarabilirsiniz. Yapıcıyı ile arayabilirsiniz new Animal(). Kullanmak için her şey aynı. Yalnızca bildirim sözdizimi farklıdır. Hala Animal.prototypeüzerinde tüm yöntemlerinizi içeren bir tane bile var. ES6 yöntemi, sadece daha süslü / daha hoş sözdizimiyle gerçekten aynı kodlama sonucunu yaratır.


İthalat tarafında, bu daha sonra şu şekilde kullanılacaktır:

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

let a = new Animal();

Bu şema, Animal yapıcısını .Animalo modülden birden fazla şeyi dışa aktarmanıza izin veren özellik olarak dışa aktarır .

Birden fazla şeyi dışa aktarmanız gerekmiyorsa, bunu yapabilirsiniz:

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

module.exports = Animal;

Ve sonra şununla içe aktarın:

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

let a = new Animal();

Neden bilmiyorum ama bu benim için işe yaramadı. module.exports = Animalişe yarayan tek çözümdür.
Sam

1
@Sam - İhracatımın gösterdiği require()şeyin, sizin ihracatınızın gösterdiğinden farklı olması gerekiyor , bu yüzden biri işe yararken diğeri çalışmasın. İçe aktarmanın nasıl çalıştığını, dışa aktarmanın nasıl tanımlandığını eşleştirmeniz gerekir. Bunu açıklamak için daha fazla ayrıntı cevabıma eklendi.
jfriend00

6

ES6'nın gerektirdiği yol import. Şunları yapabilirsiniz exportsınıfınızı ve kullanma başka bir yere aktarmak import { ClassName } from 'path/to/ClassName'sözdizimi.

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
Bunun bir seçenek olduğunu ancak bir gereklilik olmadığını açıklığa kavuşturmakta fayda var. Bu ES6 modülü sözdizimidir, ancak Node'un normal CommonJS dışa aktarmalarıyla bir ES6 sınıfını kullanmaya devam edebilirsiniz. Sınıflarla ES6 dışa aktarma sözdizimini kullanmanız gerekmez. Onu aramak The ES6 waybiraz yanıltıcıdır.
loganfsmyth

2
Bu doğru, kişisel bir tercih. Şahsen ben sadece sözdizimi tutarlılığı uğruna importover kullanırdım require.
Fan Jin

2
Evet, sağlam bir yaklaşım ve ben de yapıyorum, importBabel'in CommonJS modülleri ile birlikte çalışma şeklinin Node'da çalışmaya son vermesinin muhtemel olmadığını, dolayısıyla gelecekte Node without Babel ile uyumlu olması için kod değişiklikleri gerektirebileceğini unutmayın. .
loganfsmyth

4
ES6 modülleri (içe ve dışa aktarma) hala Düğüm 10'da deneyseldir ve düğüm başlatılırken açılması gerekir
2018

@ Dorking'in noktasına eklemek için. Düğüm 10.15.3, LTS (uzun vadeli destek) sürümüdür ve Nisan 2020'ye kadar geçerli olacaktır. Ek ayrıntılar burada: nodejs.org/en/about/releases
gtzilla

1

Düğümde Sınıfları Kullanma -

Burada ReadWrite modülünü gerekli kılıyoruz ve ReadWrite sınıfının nesnesini döndüren bir makeObject () çağırıyoruz. Yöntemleri aramak için kullandığımız. 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

Burada, yalnızca bir nesne mevcut olmadığında bir nesnenin döndürülmesini sağlayan bir makeObject yöntemi yapıyoruz.

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;

Daha fazla açıklama için https://medium.com/@nynptel/node-js-boiler-plate-code-using-singleton-classes-5b479e513f74 adresine gidin.


0

Sınıf dosyasında aşağıdakilerden birini kullanabilirsiniz:

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

veya bu sözdizimini kullanabilirsiniz

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

module.exports = ClassNameHere;

Öte yandan bu sınıfı başka herhangi bir dosyada kullanmak için şu adımları uygulamanız gerekir. Öncelikle bu dosyayı şu sözdizimini kullanarak gerekli kılın: const anyVariableNameHere = require('filePathHere');

Sonra bir nesne oluşturun const classObject = new anyVariableNameHere();

Bundan sonra classObjectgerçek sınıf değişkenlerine erişmek için kullanabilirsiniz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.