ค้นหาเว็บไซต์

javascript - คลาส ES6 ของ Node.js กับ require


ดังนั้นจนถึงตอนนี้ ฉันได้สร้างคลาสและโมดูลใน 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);
 }
}

นี่จะเป็นวิธีที่ถูกต้องหรือไม่?

นอกจากนี้ คุณจะแสดงคลาสนี้ให้ไฟล์อื่นๆ ในโปรเจกต์ Node ของฉันเห็นได้อย่างไร? และคุณยังสามารถสืบทอดคลาสนี้ได้หรือไม่ถ้าคุณกำลังใช้มันในไฟล์แยกต่างหาก?

ฉันหวังว่าบางคนในพวกคุณจะสามารถตอบคำถามเหล่านี้ได้ :)

คำตอบ #1

ใช่ ตัวอย่างของคุณจะใช้ได้ดี

สำหรับการเปิดเผยคลาสของคุณ คุณสามารถ export คลาสได้เหมือนกับสิ่งอื่น ๆ:

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

หรือแบบสั้น:

module.exports = class Animal {

};

เมื่อถูกนำเข้าไปในโมดูลอื่นแล้ว คุณสามารถปฏิบัติต่อมันเหมือนกับว่ามันถูกกำหนดไว้ในไฟล์นั้น:

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

class Cat extends Animal {
    ...
}

คำตอบ #2

เพียงแค่จัดการชื่อคลาส ES6 เหมือนกับที่คุณจัดการชื่อคอนสตรัคเตอร์ในแบบ ES5 พวกมันคือสิ่งเดียวกัน

ไวยากรณ์ ES6 เป็นเพียงน้ำตาลเชิงไวยากรณ์และสร้างโปรโตไทป์ ฟังก์ชันคอนสตรักเตอร์ และวัตถุที่เหมือนกันทุกประการ

ดังนั้น ในตัวอย่าง ES6 ของคุณที่มี:

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

var a = new Animal();

module.exports = {Animal: Animal};

หรือการแจ้งส่งออกสามารถย่อได้เป็น:

module.exports = { Animal };

คุณสามารถแค่ถือว่า Animal เป็นตัวสร้างของวัตถุของคุณ (เหมือนกับที่คุณทำใน ES5) คุณสามารถส่งออกตัวสร้างได้ คุณสามารถเรียกตัวสร้างด้วย new Animal() ทุกอย่างเหมือนกันในการใช้งาน เพียงแต่ไวยากรณ์ในการประกาศต่างกันเท่านั้น ยังมี Animal.prototype ซึ่งมีเมธอดทั้งหมดของคุณอยู่เหมือนเดิม วิธีการของ ES6 จริงๆ แล้วสร้างผลลัพธ์การเขียนโค้ดแบบเดียวกัน เพียงแต่มีไวยากรณ์ที่สวยงาม/ดีขึ้น


ในด้านการนำเข้า สิ่งนี้จะถูกใช้แบบนี้:

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

let a = new Animal();

หรือ มันก็สามารถเป็นเพียง:

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

let a = new Animal();

แผนผังนี้ส่งออกตัวสร้าง Animal เป็นสมบัติ .Animal ซึ่งช่วยให้คุณสามารถส่งออกมากกว่าหนึ่งสิ่งจากโมดูลนั้นได้

ถ้าคุณไม่จำเป็นต้องส่งออกมากกว่าสิ่งหนึ่ง คุณสามารถทำแบบนี้ได้:

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

module.exports = Animal;

แล้วจึงนำเข้ามันด้วย:

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

let a = new Animal();

บทความที่เกี่ยวข้อง