নোড.জেএস ES6 ক্লাস সাথে প্রয়োজনীয়


106

এখন অবধি, আমি 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);
 }
}

এটি কি সঠিক উপায়ে হবে?

এছাড়াও, আপনি আমার নোড প্রকল্পের মধ্যে অন্য ফাইলগুলিতে এই শ্রেণিটি কীভাবে প্রকাশ করবেন? এবং আপনি কি এখনও এই শ্রেণিটি প্রসারিত করতে সক্ষম হবেন যদি আপনি এটি একটি পৃথক ফাইলে ব্যবহার করছেন?

আমি আশা করি আপনারা কেউ কেউ এই প্রশ্নের উত্তর দিতে সক্ষম হবেন :)


4
আপনি ES6 শ্রেণীর নামের সাথে একই আচরণ করুন যেমন আপনি ES5 পদ্ধতিতে নির্মাতার নামটি ব্যবহার করেছিলেন। তারা এক এবং একই. ES6 সিনট্যাক্সটি কেবল সিনট্যাকটিক চিনি এবং ঠিক একই অন্তর্নিহিত প্রোটোটাইপ, কনস্ট্রাক্টর ফাংশন এবং অবজেক্ট তৈরি করে।
jਫਰ00

আপনার তৈরি করা আইআইএফই animalModuleকোনও নোড মডিউলে যে কোনওভাবেই তার নিজস্ব মডিউল সুযোগ রয়েছে তা বেশ অর্থহীন।
বার্গি

উত্তর:


164

হ্যাঁ, আপনার উদাহরণটি ঠিক কাজ করবে।

আপনার ক্লাস উন্মোচন করার জন্য, আপনি exportঅন্য যে কোনও কিছুর মতো ক্লাস করতে পারেন :

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

বা সংক্ষিপ্ত:

module.exports = class Animal {

};

একবার অন্য মডিউলে আমদানি করা হয়, তারপরে আপনি এটির সাথে এটি আচরণ করতে পারেন যেন এটি সেই ফাইলে সংজ্ঞায়িত হয়:

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

class Cat extends Animal {
    ...
}

8
আপনি মডিউল.এক্সপোর্টস = শ্রেণীর প্রাণী {like
পল

এটি সত্য, আমি ভুলে যাচ্ছি আপনি নিয়োগের সময় জিনিসগুলির নাম রাখতে পারেন।
রসপিডিয়া

7
module.exports = Animal;উত্তর বা প্রশ্নের সরাসরি প্রত্যক্ষ সমতুল্য const Animal = require('./animal');এবং কলিং কোড সহ বৈধ valid আপনার উত্তর অন্তর্ভুক্ত করার জন্য এটি আপডেট করতে পারেন?
সূর্য

4
ধন্যবাদ বন্ধু, আমি ক্লাসের আমদানিগুলি ঠিক ২ ঘন্টা ঠিক মতো কাজ করার সাথে লড়াই করছি।
কিউইকম্ব 123

4
নোট করুন class Animal {...} module.exports = Animalএবং module.exports = class Animal {...}একই নয়: পরবর্তী প্রকরণে আপনি new Animal()প্রয়োজনীয় ফাইলটিতে ব্যবহার করতে পারবেন না কারণ শ্রেণীর নামটি কেবল শ্রেণীর মধ্যে থেকে অ্যাক্সেসযোগ্য।
ওয়ার্টওয়ার্ট

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.js
class Animal {
    ...
}

module.exports = Animal;

এবং তারপরে এটি আমদানি করুন:

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

let a = new Animal();

আমি জানি না কেন তবে এটি কেবল আমার পক্ষে কাজ করে নি। module.exports = Animalএকমাত্র সমাধান যা কাজ করে।
স্যাম

4
@ সাম - আমার রফতানি প্রদর্শনগুলি আপনার রফতানীর require()চেয়ে আলাদা কি প্রয়োজন , তাই এটি কাজ করবে এবং অন্যটি কাজ করবে না। রফতানীর সংজ্ঞা দেওয়া হয় কীভাবে আমদানি কীভাবে কাজ করে তা আপনাকে মিলে যেতে হবে। এটি ব্যাখ্যা করতে আরও বিশদ আমার উত্তরে যুক্ত হয়েছে।
jفر00

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
এটি পরিষ্কার করা ভাল হবে যে এটি একটি বিকল্প, তবে কোনও প্রয়োজন নয়। এটি ES6 মডিউল সিনট্যাক্স, তবে আপনি নোডের সাধারণ কমনজেএস রফতানি সহ একটি ES6 শ্রেণি ব্যবহার করতে পারেন। ক্লাসগুলির সাথে আপনি ES6 রফতানি সিনট্যাক্স ব্যবহার করার কোনও প্রয়োজন নেই। এটিকে কল The ES6 wayকরা কিছুটা বিভ্রান্তিকর।
লোগানফস্মিথ

4
এটি সত্য, এটি ব্যক্তিগত পছন্দ। ব্যক্তিগতভাবে, আমি ব্যবহার করেন importওভার requireমাত্র বাক্য গঠন দৃঢ়তা অনুরোধে জন্য।
ফ্যান জিন

4
হ্যাঁ এটি একটি দৃ approach় দৃষ্টিভঙ্গি এবং আমি এটিও করি, কেবল মনে রাখবেন যে বাবেলের যেভাবে importকমনজেএস মডিউলগুলির সাথে আন্তঃসংযোগ ঘটায় নোডে কী কাজ শেষ হবে তা সম্ভবত নয়, সুতরাং এটি বাবেল ছাড়াই নোডের সাথে সামঞ্জস্যপূর্ণ হওয়ার জন্য কোড পরিবর্তন প্রয়োজন হতে পারে ।
লোগানফস্মিথ

4
ES6 মডিউলগুলি (আমদানি ও রফতানি) নোড 10 এ এখনও পরীক্ষামূলক এবং নোড চালু করার সময় চালু করা দরকার
ডিসকর্িং

@ ডর্কিং এর পয়েন্টে যুক্ত করতে। নোড 10.15.3 হ'ল এলটিএস (দীর্ঘমেয়াদী সমর্থন) সংস্করণ এবং এপ্রিল ২০২০ অবধি থাকবে Additional অতিরিক্ত বিশদগুলি এখানে: নোডজ.এস.আর.ইন
আউটআউট

1

নোডে ক্লাস ব্যবহার -

এখানে আমরা রিডরাইট মডিউলটির প্রয়োজন এবং একটি মেকওবজেক্ট () কল করছি যা রিডরাইটিং শ্রেণীর অবজেক্টটি ফেরত দেয়। যা আমরা পদ্ধতিগুলি কল করতে ব্যবহার করছি। 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;

রিডওরাইট.জেএস

এখানে আমরা একটি মেকওজেক্ট পদ্ধতি তৈরি করছি, যা নিশ্চিত করে যে কোনও বস্তু উপলব্ধ নেই কেবলমাত্র যদি কোনও অবজেক্ট উপলব্ধ না থাকে।

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-used-singleton-class-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.