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();
