מדוע מאפיינים של קלאס נרשמים על המופע עצמו ולא רק על הפורופוטייפ כמו מתודות?
-
class newObj { constructor() {} property1 = 5 property2 = 6 method1() {} method2() {} } newObj \\ {property1: 5, property2: 6}
נכון יותר לשאול אם אפשר ואיך בשביל שזה לא יקרה?
זה 'מספים' את האוביקט
שאלה נוספת, ישנה דרך להוסיף מתודות או מאפיינים לפרוטוטייפ אחרי יצירת המופע?
class sonObj { constructor( father ) { this.father = father } property1 = 5 property2 = 6 method1() {} method2() {} } class fatherObj { constructor() { this.son = new sonObj( this ) } property1 = 5 property2 = 6 method1() {} method2() {} }
במקרה זה ה-this של האבא נרשם כמאפיין של כל מופע, אני רוצה שזה ישב על הפרוטוטייפ, אבל אני לא יכול לרשום א"ז בתוך הקלאס, כי אז ה-this הזה עדיין לא קיים.
יש פתרון?? -
@אהרן אמר במדוע מאפיינים של קלאס נרשמים על המופע עצמו ולא רק על הפורופוטייפ כמו מתודות?:
נכון יותר לשאול אם אפשר ואיך בשביל שזה לא יקרה?
זה 'מספים' את האוביקטחוץ ממה שזה מספים, לכאורה זה בזבוז של זכרון.
על שאילת ה"מדוע" שבתוך הכותרת אני לא יכול לענות (למדנים יודעים ש"מיר פרעגן וואס נישט פארוואס"... או במילים אחרות: אני לא יודע... אולי התשובה היא, שכל המטרה של תחביר זה הוא לתת לאנשים תחביר מוכר של קלאסים ובמודל הקלאסים הרגיל אין כזה דבר של prototype. יש רק מאפיין של מופע ומאפיין של קלאס)
אם הבנתי נכון, אתה רוצה לקבל את התוצאה של
newObj.prototype = x
אבל בתחביר החדש של קלאסים.
נראה לי שאתה יכול לקבל את מבוקשך בשתי דרכים. אולי מישהו אחר יכול לשפוך יותר אור על ההבדלים ואיזה מהם יותר מומלצת.1
זה עושה מאפיין גלובלי של הקלאס - השדה כלל לא מאוגד למופע של הקלאס אלא לקלאס עצמו.
class NewObj { constructor() {} static property1 = 5 static property2 = 6 method1() {} method2() {} } let obj1 = new NewObj; obj1.property1; // undefined NewObj.property1; // 5
2
פשוט להשתמש בתחביר הישן עם התחביר החדש ביחד. הם לא סותרים אחד את השני:
זה עושה מאפיין של ה-prototype של הקלאס.
class NewObj { constructor() {} method1() {} method2() {} } NewObj.prototype.property1 = 5; NewObj.prototype.property2 = 6; let obj1 = new NewObj; obj1.property1; // 5 NewObj.property1; // undefined
-
לענות על שאלה 2:
@אהרן אמר במדוע מאפיינים של קלאס נרשמים על המופע עצמו ולא רק על הפורופוטייפ כמו מתודות?:
ישנה דרך להוסיף מתודות או מאפיינים לפרוטוטייפ אחרי יצירת המופע?
כן
פשוט כותביםclassName.prototype.propertyName = propertyValue
במקרה זה ה-this של האבא נרשם כמאפיין של כל מופע, אני רוצה שזה ישב על הפרוטוטייפ, אבל אני לא יכול לרשום א"ז בתוך הקלאס, כי אז ה-this הזה עדיין לא קיים
לא בדיוק הבנתי את המטרה הסופית, אבל אם אתה רוצה ירושה, תשתמש ב-
extends
-
@yossiz אמר במדוע מאפיינים של קלאס נרשמים על המופע עצמו ולא רק על הפורופוטייפ כמו מתודות?:
לא בדיוק הבנתי את המטרה הסופית, אבל אם אתה רוצה ירושה, תשתמש ב-
extends
הבעיה שיש להם מתודות בעלי שמות זהים
לכן אני רוצה את ההצמדות לאוביקט האבא על אוביקט נפרד במופע הנוכחי. -
@yossiz אמר במדוע מאפיינים של קלאס נרשמים על המופע עצמו ולא רק על הפורופוטייפ כמו מתודות?:
לא בדיוק הבנתי את המטרה הסופית, אבל אם אתה רוצה ירושה, תשתמש ב-extends
extends לא יוצר הורשה היררכית
אלא מיזוג בין 2 הפרוטוטייפלא הצלחתי בנתיים ליצור הורשה היררכית (שאם יש אותו שם מתודה לפרוטוטייפ האב והבן, ישתמש עם הבן).
-
השאלה מאוד זרה לי, כל הרעיון של קלאס זה מייצג למופע בלתי תלוי בכל מופע אחר.
אם זה היה בפרוטוטייפ אז השינוי היה משתקף בכל המופעים.
לפעמים רוצים לאחסן מידע משותף לכלל המופעים ובשביל לחסוך זיכרון עושים מאפיין "סטטי" כמו ש@yossiz הציע.
הלשון מספים משמע שצורך במאפיינים הוא בעיקר פנימי ואין טעם להציג אותם "מבחוץ", זה אומר שיש צורך במאפיינים פרטיים, וזה אכן לא קל בES6 לעשות את זה.