שאלות בסיסיות ב-js או בכלל בתכנות
-
function myModule() { ... } var myModule = new myModule(); //creating the instanceמה זה עושה ??
מה עושה שמכניסים את אותו משתנה לתוכו?
כשכותבים new לפני קריאה לפונקציה, אז:
- במידה והפונקציה מחזירה אובייקט (לא פרימיטיבי כטקסט ומספר כלומר כזה שהלוג שלו מיוצג עם סוגריים {}), אז הוא מוחזר למשתנה.
- במידה ואיננה מחזירה אובייקט (או שאיננה מחזירה כלום או טיפוס פרימיטיבי) אז נוצר אובייקט חדש שמהווה "קרקע" (בתכנותית: מופע, instance) לthis שבפונקציה. בלי ה"קרקע" הזו הפונקציה הנקראת "דורכת" על "קרקע" הפונקציה הקוראת.
הדגמה:
function func() { this.a = "variable "; return "function result..."; } var resultWithoutNew = func(); console.log(resultWithoutNew); //function result... console.log(a); // variable console.log(resultWithoutNew.a); // undefined a = 123; var resultWithNew = new func(); console.log(resultWithNew); // { a: 'variable ' } console.log(a); // 123 console.log(resultWithNew.a); // variable
הnew מאפשר לתת "סקופ" חדש למה שהפונקציה מחזירה וככה ליצור מופעים שונים של אותו מחלקה-אב טיפוס על מאפייניו והפונקציות שלו.
פורסם במקור בפורום CODE613 ב04/09/2015 12:35 (+03:00)
-
@דוד ל.ט.
תלונתו היא שאתה ניגש לvalur בלי לבדוק קודם שהerror ריק (אם תוסיף if (!err) אזי הוא ישתוק כנראה), אבל נשגב מבינתי איך ה"חוזה" הזה מוכר לIDE.
עכשיו מצאתי איך הפונקציה עובדת
באמת עם try (מושג חדש שלא הכרתי עד שהכרת לי)LevelUP.prototype.get = function (key_, options, callback) { var self = this , key callback = getCallback(options, callback) if (maybeError(this, options, callback)) return if (key_ === null || key_ === undefined || 'function' !== typeof callback) return readError(this , 'get() requires key and callback arguments', callback) options = util.getOptions(options) key = this._codec.encodeKey(key_, options) options.asBuffer = this._codec.valueAsBuffer(options) this.db.get(key, options, function (err, value) { if (err) { if ((/notfound/i).test(err) || err.notFound) { err = new NotFoundError( 'Key not found in database [' + key_ + ']', err) } else { err = new ReadError(err) } return dispatchError(self, err, callback) } if (callback) { try { value = self._codec.decodeValue(value, options) } catch (e) { return callback(new EncodingError(e)) } callback(null, value) } }) }
פורסם במקור בפורום CODE613 ב06/09/2015 21:32 (+03:00)
-
@דוד ל.ט.
function myModule() { ... } var myModule = new myModule(); //creating the instanceמה זה עושה ??
מה עושה שמכניסים את אותו משתנה לתוכו?
כשכותבים new לפני קריאה לפונקציה, אז:
- במידה והפונקציה מחזירה אובייקט (לא פרימיטיבי כטקסט ומספר כלומר כזה שהלוג שלו מיוצג עם סוגריים {}), אז הוא מוחזר למשתנה.
- במידה ואיננה מחזירה אובייקט (או שאיננה מחזירה כלום או טיפוס פרימיטיבי) אז נוצר אובייקט חדש שמהווה "קרקע" (בתכנותית: מופע, instance) לthis שבפונקציה. בלי ה"קרקע" הזו הפונקציה הנקראת "דורכת" על "קרקע" הפונקציה הקוראת.
הדגמה:
function func() { this.a = "variable "; return "function result..."; } var resultWithoutNew = func(); console.log(resultWithoutNew); //function result... console.log(a); // variable console.log(resultWithoutNew.a); // undefined a = 123; var resultWithNew = new func(); console.log(resultWithNew); // { a: 'variable ' } console.log(a); // 123 console.log(resultWithNew.a); // variable
הnew מאפשר לתת "סקופ" חדש למה שהפונקציה מחזירה וככה ליצור מופעים שונים של אותו מחלקה-אב טיפוס על מאפייניו והפונקציות שלו.
לא מבין [כמעט] כלום
this.a = "variable ";
שווה ל
func.a = "variable ";
?
איך
console.log(a); // variable a = 123;
ממתי יש משתנה a?
הרי a הוא רק תכונה (property) של func והעתקים ממנו?!
var resultWithoutNew = func();
אם כן אני צודק שיש 3 'רמות' של העברה בין פונקציה לפונקציה
resultWithNew = func(); resultWithNew = new func(); resultWithNew = func;
- מעביר רק את התוצאה.
- רק את התכונות (במידה ומדובר באוביקט).
- את כל הפונקציה במלואה.
?
אם משתמשים באפשרות 3, ואז שעכשיו מכיל בתוכו
this.a = "variable ";
מי שם ה-this ?
סליחה על ההתקפה ותודה על הסבלנות
פורסם במקור בפורום CODE613 ב18/09/2015 16:48 (+03:00)