במאמר הקודם הסברתי על אירועים ב-Node.js ואז אמרתי שאפשר לבצע ירושה באופן פשוט וקל עם utlities. זה גם מה שנלמד היום – איך משתמשים ב-utilities שזה עוד מודול ליבה של Node.js. רשימת כל מודולי הליבה, אגב, נמצאת באתר של Node.js.
באופן עקרוני, מודול Utilities הוא לא מודול "אמיתי" אלא אוסף של כלים שימושיים במיוחד. חלק מהכלים מסייעים לנו להפוך את הקוד ליותר נקי, חלק מהכלים עושים פעולות משמעותיות במיוחד. כל המתודות נמצאות בדוקומנטציה של Node.js Utilities ומומלץ להסתכל עליה.
המתודה הראשונה שאנו רואים היא מתודה שמאוד דומה ל-sprintf, אם אתם מכירים – שזו דרך מאוד שימושית ליצור מחרוזת טקסט עם משתנים. הנה דוגמה:
util = require("util"); //The require
someVar = 'This is my var!'
var result = util.format('This is some test string with variable example: %s', someVar);
console.log(result);
//prints: This is some test string with variable example: This is my var!
אם נמשיך ונסתכל במתודות שיש בדוקומנטציה, אנו נראה שיש שם כמה מתודות שפשוט מדפיסות לקונסולה, למשל:
require('util').debug('message on stderr');
או אפילו עם time stamp!
require('util').log('Timestamped message.');
אחת מהמתודות שם שימושית כיוון שהיא מדפיסה את כל האובייקט באופן נוח מאוד לקריאה מהקונסולה:
var util = require('util');
var http = require('http');
console.log(util.inspect(http, { showHidden: false, depth: null, colors: true }));
את הדוגמה הזו ואחרות הבאתי כמובן מהדוקומנטציה של util, לא המצאתי פה משהו חדש. כך למשל בדוקומנטציה של מתודת inspect יש הסבר מפורט על כל הגדרה שאפשרת לשנות (מה זה colors או depth למשל). אין טעם לעבור כמו תוכי במדריך הזה על מנת להסביר את מה שהוסבר היטב בדוקומנטציה, אבל כן שווה להתעכב על אחת המתודות החשובות שיש ב-util – מתודה שמאפשרת לנו לבצע ירושה מאובייקט לאובייקט – ממש כמו בכל שפה נורמלית.
ב-JavaScript, כל דבר, למעט מערך, נחשב כאובייקט. בין אם מדובר בפונקציה, מחרוזת טקסט או מספר. כל דבר הוא אובייקט. למרות זאת, אין דרך נורמלית לבצע ירושה. למה אנחנו צריכים לבצע ירושה? קחו למשל את מודול events שעליו דיברנו במאמר הקודם – על מנת שהמודול שאני כותב יוכל לירות אירועים, יהיה לי הרבה יותר קל לרשת ממודול אירועים מאשר להתחיל לעשות require ל-events, להחזיר את זה לאובייקט וממנו לקרוא ל-emit. הרבה יותר קל לעשות משהו כזה:
myModule.prototype.saveTheObject = function (obj) {
//doing something that related to saving
this.emit("saved-myModule", obj);
};
כלומר שמתודת ה-emit, או מתודת ה-on שמאזינה לאירועים (אם המודול שלי קשור למודולים אחרים שמשחררים אירועים) תהיה חלק מה-class שלי. איך אני בעצם גורם ל-myModule class לרשת מ-event? כאן נכנסת לפעולה מתודת inherits שמקבלת שני ארגומנטים – את האובייקט שיורש ואת האובייקט שיורשים ממנו. ככה זה נראה בעולם האמיתי:
var util = require("util");
var events = require("events");
function myModule() { //first we create the module object
}
util.inherits(myModule, events.EventEmitter); //The inheritance
myModule.prototype.saveTheObject = function (obj) { //some method that emitting event
//doing something that related to saving
this.emit("saved-myModule", obj);
};
/** module ends here **/
var myModule = new myModule(); //creating the instance
myModule.on("saved-myModule", function(data) {
console.log('Received data: "' + data + '"');
})
myModule.saveTheObject("It works!"); // Received data: "It works!"
את הדוגמה שלעיל ביססתי על הדוגמה שמופיעה בדוקומנטציה, אז שווה להסתכל גם שם.
חשוב לציין שיש לא מעטים שחושבים שירושה ב-JavaScript היא לא נכונה ויעדיפו לעשות instance לאובייקטים ולהשתמש במתודות שלהם באופן ישיר. אבל טוב לדעת שזה אפשרי.
במאמר הבא אנו נדבר על streams ב-Node.js
⚠️ תזכורת – המדריכים האלו הם רק טעימה, בספר שלי "ללמוד Node.js בעברית" יש הסברים מלאים ומקיפים על השפה המיועדים ללימוד עצמי. עם תרגילים והסברים. הספר יצא לאור בשיתוף הקריה האקדמית אונו ובתמיכת החברות אלמנטור, ו-Iron source ונערך טכנית על ידי בנג'י גרינבאום (מפתח ליבה של Node.js), גיל פינק ומתכנתים מעולים נוספים.
3 תגובות
(node) util.debug is deprecated. Use console.error instead.
ב ES6, לירושה יש תחביר סטנדרטי.
צריך לעדכן בגוף המדריך.
תודה.
ב-JavaScript, כל דבר, למעט מערך, נחשב כאובייקט.
זה לא נכון, גם מערכים הם אובייקטים.