आवश्यकता के साथ 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 तरीके से कंस्ट्रक्टर नाम के साथ किया होगा। वे एक ही हैं। ईएस 6 सिंटैक्स सिंटैक्टिक शुगर है और बिल्कुल वही अंतर्निहित प्रोटोटाइप, कंस्ट्रक्टर फ़ंक्शन और ऑब्जेक्ट बनाता है।
jfriend00

वह IIFE जो आपकी रचना करता animalModuleहै एक नोड मॉड्यूल में बहुत ही बेकार है जो कि वैसे भी अपना स्वयं का मॉड्यूल गुंजाइश है।
बरगी

जवाबों:


156

हां, आपका उदाहरण ठीक काम करेगा।

अपनी कक्षाओं को उजागर करने के लिए, आप exportकिसी और चीज की तरह एक वर्ग बना सकते हैं :

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

या कम:

module.exports = class Animal {

};

एक बार किसी अन्य मॉड्यूल में आयात करने के बाद, आप इसे मान सकते हैं जैसे कि यह उस फ़ाइल में परिभाषित किया गया था:

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

class Cat extends Animal {
    ...
}

8
आप मॉड्यूल की तरह कुछ भी कर सकते हैं। निर्यात = वर्ग पशु {}
पॉल

यह सच है, मैं भूल रहा हूँ कि आप असाइनमेंट के दौरान चीजों को नाम दे सकते हैं।
रॉसिडीया

यह कोड शैली और स्पष्टता के लिए नीचे आता है। module.exportsआमतौर पर एक अनाम निर्यात के exportलिए उपयोग किया जाता है , जबकि एक नामित निर्यात के लिए उपयोग किया जाता है। यह एक बुनियादी कोडिंग शिष्टाचार (आप कह सकते हैं) है, जो आपकी कक्षा, मॉड्यूल एट अल एट वगैरह को आयात करने के तरीके जानने के लिए दूसरों की सहायता कर सकता है।
greg.arnott

7
module.exports = Animal;प्रश्न का उत्तर या सबसे सीधा समकक्ष होगा और const Animal = require('./animal');कॉलिंग कोड के साथ मान्य होगा । क्या आप इसे शामिल करने के लिए अपने उत्तर को अपडेट कर सकते हैं?
सूर्य

1
धन्यवाद दोस्त, मैं 2 घंटे के लिए सही ढंग से काम कर रहे वर्ग आयात पाने के साथ जूझ रहा हूं।
कीवीकोम्ब १२२

11

बस ES6 वर्ग के नाम के साथ वैसा ही व्यवहार करें जैसा आपने ES5 तरीके से कंस्ट्रक्टर नाम के साथ किया होगा। वे एक ही हैं।

ईएस 6 सिंटैक्स सिंटैक्टिक शुगर है और बिल्कुल वही अंतर्निहित प्रोटोटाइप, कंस्ट्रक्टर फ़ंक्शन और ऑब्जेक्ट बनाता है।

तो, अपने ES6 उदाहरण के साथ:

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

var a = new Animal();

module.exports = {Animal: Animal};

आप बस Animalअपनी वस्तु के निर्माता की तरह व्यवहार कर सकते हैं (जैसा कि आपने ES5 में किया होगा)। आप कंस्ट्रक्टर को निर्यात कर सकते हैं। आप कंस्ट्रक्टर के साथ कॉल कर सकते हैं new Animal()। इसका उपयोग करने के लिए सब कुछ समान है। केवल घोषणा सिंटैक्स अलग है। वहाँ अभी भी एक है Animal.prototypeकि उस पर अपने सभी तरीके हैं। ईएस 6 रास्ता वास्तव में एक ही कोडिंग परिणाम बनाता है, बस कट्टरपंथी / अच्छे वाक्यविन्यास के साथ।


आयात पक्ष पर, यह तब इस तरह इस्तेमाल किया जाएगा:

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

let a = new Animal();

यह योजना पशु निर्माता को उस .Animalसंपत्ति के रूप में निर्यात करती है जो आपको उस मॉड्यूल से एक से अधिक चीजों का निर्यात करने की अनुमति देती है।

यदि आपको एक से अधिक चीजों का निर्यात करने की आवश्यकता नहीं है, तो आप यह कर सकते हैं:

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

module.exports = Animal;

और, फिर इसके साथ आयात करें:

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

let a = new Animal();

मुझे पता नहीं क्यों लेकिन यह सिर्फ मेरे लिए काम नहीं किया। module.exports = Animalएकमात्र समाधान है जो काम करता है।
सैम

1
@Sam - मेरे एक्सपोर्ट शो को require()आपके एक्सपोर्ट शो से अलग क्या चाहिए, इसीलिए एक काम होगा और दूसरा नहीं। आपको यह बताना होगा कि निर्यात कैसे परिभाषित है, इसके साथ आयात कैसे काम करता है। इसे समझाने के लिए और विवरण मेरे जवाब में जुड़ गए।
at१०

6

आवश्यकता के ES6 तरीका है import। आप exportअपने वर्ग को और 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
यह स्पष्ट करना अच्छा होगा कि यह एक विकल्प है, लेकिन आवश्यकता नहीं है। यह ईएस 6 मॉड्यूल सिंटैक्स है, लेकिन आप फिर भी नोड के सामान्य कॉमनज एक्सपोर्ट के साथ ईएस 6 क्लास का उपयोग कर सकते हैं। कोई आवश्यकता नहीं है कि आप कक्षाओं के साथ ES6 निर्यात सिंटैक्स का उपयोग करें। इसे कॉल करना The ES6 wayकुछ भ्रामक है।
लोगनफ़्समीथ

2
यह सच है, यह एक व्यक्तिगत प्राथमिकता है। व्यक्तिगत रूप से, मैं प्रयोग करेंगे importसे अधिक requireसिर्फ वाक्य रचना स्थिरता की खातिर।
फैन जिन

2
हाँ, यह एक ठोस दृष्टिकोण है और मैं यह भी करता हूं, बस ध्यान रखें कि जिस तरह importसे कॉमनजस मॉड्यूल के साथ बैबेल के इंटरऑपरेटर्स की संभावना नहीं है, वह नोड में काम करना समाप्त कर देगा, इसलिए इसे भविष्य में कोड परिवर्तन की आवश्यकता हो सकती है, क्योंकि वे बैबेल के साथ नोड के साथ संगत हो सकते हैं ।
लोगनफ़्समीथ

4
ES6 मॉड्यूल (आयात और निर्यात) नोड 10 में अभी भी प्रायोगिक हैं और नोड लॉन्च करते समय चालू करने की आवश्यकता है
dcorking

@ डॉर्किंग बिंदु पर जोड़ने के लिए। नोड 10.15.3 एलटीएस (दीर्घकालिक समर्थन) संस्करण है और अप्रैल 2020 तक रहेगा। अतिरिक्त विवरण यहां: nodejs.org/en/about/releases
gtzilla 25'19

1

नोड में कक्षाओं का उपयोग करना -

यहां हमें 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

यहाँ हम एक मेकओबजेक्ट विधि बनाते हैं, जो यह सुनिश्चित करता है कि कोई वस्तु वापस लौटा दी जाए, यदि कोई वस्तु उपलब्ध नहीं है।

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वास्तविक वर्ग चर का उपयोग करने के लिए उपयोग कर सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.