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