الفئات المضمنة مثل Array وMap وغيرها قابلة للتمديد أيضًا.
على سبيل المثال، هنا يرث PowerArray
من Array
الأصلي:
// أضف طريقة أخرى إليها (يمكن فعل المزيد) فئة PowerArray تمتد صفيف { فارغ () { إرجاع هذا الطول === 0; } } Let arr = new PowerArray(1, 2, 5, 10, 50); تنبيه (arr.isEmpty())؛ // خطأ شنيع Let filteredArr = arr.filter(item => item >= 10); تنبيه (filteredArr)؛ // 10، 50 تنبيه (filteredArr.isEmpty())؛ // خطأ شنيع
يرجى ملاحظة شيء مثير للاهتمام للغاية. الأساليب المضمنة مثل filter
map
وغيرها - تقوم بإرجاع كائنات جديدة من النوع الموروث PowerArray
تمامًا. يستخدم تطبيقهم الداخلي خاصية constructor
الكائن لذلك.
في المثال أعلاه،
arr.constructor === PowerArray
عندما يتم استدعاء arr.filter()
، فإنه يُنشئ داخليًا مصفوفة جديدة من النتائج باستخدام arr.constructor
بالضبط، وليس Array
الأساسي. وهذا في الواقع رائع جدًا، لأنه يمكننا الاستمرار في استخدام أساليب PowerArray
بشكل أكبر في النتيجة.
والأكثر من ذلك، يمكننا تخصيص هذا السلوك.
يمكننا إضافة Symbol.species
getter ثابت خاص إلى الفصل. إذا كان موجودًا، فيجب أن يُرجع المُنشئ الذي ستستخدمه JavaScript داخليًا لإنشاء كيانات جديدة في map
filter
وما إلى ذلك.
إذا أردنا استخدام طرق مدمجة مثل map
أو filter
لإرجاع المصفوفات العادية، فيمكننا إرجاع Array
في Symbol.species
، كما هو الحال هنا:
فئة PowerArray تمتد صفيف { فارغ () { إرجاع هذا الطول === 0; } // ستستخدم الطرق المضمنة هذا كمنشئ الحصول على ثابت [Symbol.species]() { صفيف العودة؛ } } Let arr = new PowerArray(1, 2, 5, 10, 50); تنبيه (arr.isEmpty())؛ // خطأ شنيع // ينشئ المرشح مصفوفة جديدة باستخدام arr.constructor[Symbol.species] كمنشئ Let filteredArr = arr.filter(item => item >= 10); // filteredArr ليس PowerArray، بل Array تنبيه (filteredArr.isEmpty())؛ // خطأ: filteredArr.isEmpty ليس دالة
كما ترى، الآن يقوم .filter
بإرجاع Array
. لذلك لم يتم تمرير الوظيفة الموسعة أكثر من ذلك.
مجموعات أخرى تعمل بالمثل
تعمل المجموعات الأخرى، مثل Map
و Set
، بنفس الطريقة. يستخدمون أيضًا Symbol.species
.
الكائنات المضمنة لها أساليبها الثابتة الخاصة، على سبيل المثال Object.keys
و Array.isArray
وما إلى ذلك.
كما نعلم بالفعل، فإن الطبقات الأصلية تمتد بعضها البعض. على سبيل المثال، يقوم Array
بتوسيع Object
.
عادةً، عندما تقوم إحدى الفئات بتوسيع فئة أخرى، يتم توريث كل من الأساليب الثابتة وغير الثابتة. تم شرح ذلك بدقة في المقالة الخصائص والأساليب الثابتة.
ولكن الطبقات المضمنة هي استثناء. إنهم لا يرثون الإحصائيات من بعضهم البعض.
على سبيل المثال، يرث كل من Array
و Date
من Object
، لذا فإن مثيلاتهما تحتوي على أساليب من Object.prototype
. لكن Array.[[Prototype]]
لا يشير إلى Object
، لذلك لا يوجد، على سبيل المثال، طريقة ثابتة Array.keys()
(أو Date.keys()
).
فيما يلي بنية الصورة Date
Object
:
كما ترى، لا يوجد رابط بين Date
و Object
. إنهما مستقلان، فقط Date.prototype
يرث من Object.prototype
.
هذا فرق مهم في الميراث بين الكائنات المضمنة مقارنة بما نحصل عليه من extends
.