סקירה מהירה של סמלי JavaScript

סמלים

סמלים הם פרימיטיביים חדשיםסוג שהוצג ב- ES6. סמלים הם מזהים ייחודיים לחלוטין. בדיוק כמו עמיתיהם הפרימיטיביים ( מספר , מחרוזת , בוליאני ), ניתן ליצור אותם באמצעות פונקציית המפעל Symbol()המחזירה סמל.

const symbol = Symbol('description')

בכל פעם שאתה מתקשר לפונקציית המפעל, נוצר סמל חדש וייחודי. הפרמטר האופציונלי עם ערך מחרוזת הוא מחרוזת תיאורית המוצגת בעת הדפסת הסמל.

> symbol Symbol(description)

כל סמל שהוחזר על ידי Symbol()הוא ייחודי, ולכן לכל סמל יש זהות משלו:

> Symbol() === Symbol() false

אתה יכול לראות שהסמלים הם פרימיטיביים אם אתה מחיל את typeofהמפעיל על אחד מהם - זה יחזיר תוצאה חדשה ספציפית לסמל:

> typeof symbol 'symbol'

שימוש במקרה: סמלים כמפתחות של נכסים שאינם ציבוריים

בכל פעם שיש היררכיות בירושה ב- JavaScript, יש לך שני סוגים של מאפיינים (למשל נוצרים באמצעות מחלקות, גישה אב טיפוסית בלבד):

  • נכסי ציבור נראים על ידי לקוחות קוד
  • נכסים פרטיים משמשים באופן פנימי בתוך החלקים המרכיבים את היררכיית הירושה (למשל מחלקות, אובייקטים).

לשם שימושיות, לרוב נכסים ציבוריים כוללים מפתחות מחרוזת. אך בנכסים פרטיים עם מפתחות מחרוזת, התנגשויות בשמות מקריות עלולות להפוך לבעיה. לכן, סמלים הם בחירה טובה.

לדוגמה, בקוד הבא משתמשים בסמלים עבור נכסים פרטיים _counterו _action:

const _counter = Symbol('counter'); const _action = Symbol('action'); class Countdown { constructor(counter, action) { this[_counter] = counter; this[_action] = action; } dec() { let counter = this[_counter]; if (counter < 1) return; counter--; this[_counter] = counter; if (counter === 0) { this[_action](); } } }

שים לב שסמלים מגנים עליך רק מפני התנגשויות שמות, ולא מפני גישה בלתי מורשית. אתה יכול לגלות את כל מפתחות המאפיין של האובייקט - כולל סמלים - באמצעות הדברים הבאים:

const obj = { [Symbol('my_key')] : 1, enum : 2, nonEnum : 3 }; Object.defineProperty(obj, 'nonEnum', { enumerable: false }); // Making 'nonEnum' as not enumerable. // Ignores symbol-valued property keys: > Object.getOwnPropertyNames(obj) ['enum', 'nonEnum'] // Ignores string-valued property keys: > Object.getOwnPropertySymbols(obj) [Symbol(my_key)] // Considers all kinds of keys: > Reflect.ownKeys(obj) [Symbol(my_key),'enum', 'nonEnum'] // Only considers enumerable property keys that are strings: > Object.keys(obj) ['enum']

האם אנחנו באמת צריכים סמלים?

השתמש בסמלים כאשר הדרישה שלך היא אחת מאלה:

  • Enum: כדי לאפשר לך להגדיר קבועים עם שמות סמנטיים וערכים ייחודיים.
const directions = { UP : Symbol( ‘UP’ ), DOWN : Symbol( ‘DOWN’ ), LEFT : Symbol( ‘LEFT’ ), RIGHT: Symbol( ‘RIGHT’ ) };
  • התנגשויות שם: כאשר רצית למנוע התנגשויות עם מפתחות בחפצים
  • פרטיות: כאשר אינך מעוניין שניתן יהיה למנות את מאפייני האובייקט שלך
  • פרוטוקולים: כדי להגדיר כיצד ניתן לאתר אובייקט.

    דמיין למשל ספרייה כמו dragulaהגדרת פרוטוקול באמצעות Symbol.for(dragula.moves). אתה יכול להוסיף שיטה על כך Symbolלכל רכיב DOM. אם אלמנט DOM עוקב אחר הפרוטוקול, אז dragulaיכול להתקשר el[Symbol.for('dragula.moves')]()לשיטה המוגדרת על ידי המשתמש כדי לקבוע אם ניתן להזיז את האלמנט.

  • סמלים ידועים: בנוסף לסמלים המוגדרים על ידי המשתמש, ב- JavaScript יש כמה סמלים מובנים. אלה מייצגים התנהגויות שפה פנימיות שלא נחשפו למפתחים ב- <ES5. מידע נוסף כאן .

סיכום

Symbolsב- JavaScript יכול לספק ייחודיות ברמת הגישה לאובייקטים. כדאי לכל היזמים להבין הבנה בסיסית שלהם ואת מקרי השימוש השונים שלהם.

code = coffee + developer