אב טיפוס
JavaScript היא שפה מבוססת אב-טיפוס, ולכן הבנת מושא האב-טיפוס היא אחד המושגים החשובים ביותר שעליהם מתרגלי JavaScript צריכים לדעת. מאמר זה ייתן לך סקירה קצרה של אובייקט הפרוטוטייפ באמצעות דוגמאות שונות. לפני שתקרא מאמר זה, תצטרך להבין הבנה בסיסית של this
ההתייחסות ב- JavaScript.
אובייקט אב טיפוס
לשם הבהירות, נבחן את הדוגמה הבאה:
function Point2D(x, y) { this.x = x; this.y = y; }
כאשר Point2D
מצהירים על פונקציה, prototype
ייווצר עבורה מאפיין ברירת מחדל בשם (שימו לב שב- JavaScript פונקציה היא גם אובייקט). prototype
הנכס הוא אובייקט המכיל constructor
נכס והערך שלה הוא Point2D
פונקציה: Point2D.prototype.constructor = Point2D
. וכאשר אתה מתקשר Point2D
עם new
מילת מפתח, אובייקטים שנוצרו לאחרונה ירשו את כל המאפייניםPoint2D.prototype
. כדי לבדוק את זה, אתה יכול להוסיף שיטה בשם move
לתוך Point2D.prototype
כדלקמן:
Point2D.prototype.move = function(dx, dy) { this.x += dx; this.y += dy; } var p1 = new Point2D(1, 2); p1.move(3, 4); console.log(p1.x); // 4 console.log(p1.y); // 6
Point2D.prototype
נקרא אובייקט אב טיפוס או טיפוס של p1
אובייקט עבור כל אובייקט אחר נוצר עם new Point2D(...)
תחביר. אתה יכול להוסיף מאפיינים נוספים Point2D.prototype
להתנגדות כרצונך. הדפוס הנפוץ הוא הצהרה על שיטות Point2D.prototype
ותכונות אחרות יוכרזו בתפקוד קונסטרוקטור.
אובייקטים מובנים ב- JavaScript בנויים בצורה דומה. לדוגמה:
- אב טיפוס של אובייקטים שנוצרו עם
new Object()
או{}
תחביר הואObject.prototype
. - אב טיפוס של מערכים שנוצרו עם
new Array()
או[]
תחביר הואArray.prototype
. - וכך הלאה עם חפצים מובנים אחרים כגון
Date
וRegExp
.
Object.prototype
עוברת בתורשה לכל האובייקטים ואין לו אב-טיפוס (האב-טיפוס שלו null
).
שרשרת אב-טיפוס
מנגנון שרשרת האב-טיפוס פשוט: כשאתה ניגש למאפיין p
על אובייקט obj
, מנוע JavaScript יחפש במאפיין זה בתוך obj
אובייקט. אם המנוע לא מצליח לחפש, הוא ממשיך לחפש באב-טיפוס של obj
האובייקט וכן הלאה עד להגיע אליו Object.prototype
. אם לאחר סיום החיפוש, ולא נמצא דבר התוצאה תהיה undefined
. לדוגמה:
var obj1 = { a: 1, b: 2 }; var obj2 = Object.create(obj1); obj2.a = 2; console.log(obj2.a); // 2 console.log(obj2.b); // 2 console.log(obj2.c); // undefined
בקטע הקודם, ההצהרה var obj2 = Object.create(obj1)
תיצור obj2
אובייקט עם obj1
אובייקט אב-טיפוס . במילים אחרות, obj1
הופך לאב-טיפוס של obj2
במקום Object.prototype
כברירת מחדל. כפי שאתה יכול לראות, b
הוא לא רכוש של obj2
, אתה עדיין יכול לגשת אליו באמצעות שרשרת האב-טיפוס. עבור c
נכס, לעומת זאת, אתה מקבל undefined
ערך מכיוון שלא ניתן למצוא אותו ב- obj1
ו- Object.prototype
.
שיעורים
ב- ES2016, כעת נשתמש Class
במילת המפתח, כמו גם בשיטות שהוזכרו לעיל כדי לתפעל prototype
. JavaScript Class
מושך מפתחים מרקע OOP, אך למעשה הוא עושה את אותו הדבר כמו לעיל.
class Rectangle { constructor(height, width) { this.height = height this.width = width } get area() { return this.calcArea() } calcArea() { return this.height * this.width } } const square = new Rectangle(10, 10) console.log(square.area) // 100
זה בעצם אותו הדבר כמו:
function Rectangle(height, width) { this.height = height this.width = width } Rectangle.prototype.calcArea = function calcArea() { return this.height * this.width }
getter
ואת setter
השיטות בכיתות לאגד נכס אובייקט לפונקציה כי תיקרא כאשר הקניין הזה הוא הרים את מבטו. זה רק סוכר תחבירי שיסייע לך להקל על חיפוש או קביעת מאפיינים.
מידע נוסף על אב טיפוס של JS:
- כל מה שאתה צריך לדעת כדי להבין את האב-טיפוס של JavaScript