نظرة عامة سريعة على رموز 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في جافا سكريبت يمكن أن يوفر تفرد مستوى الوصول للكائنات. من المفيد لجميع المطورين أن يكون لديهم فهم أساسي لها ولحالات الاستخدام المختلفة الخاصة بهم.

code = coffee + developer