الـ classes المدمجة مثل الـ Array و Map وغيرهم قابلين للامتداد أيضا
على سبيل المثال ، هنا يرث PowerArray منArray الأصلي:
// add one more method to it (can do more)
class PowerArray extends Array {
isEmpty() {
return this.length === 0;
}
}
let arr = new PowerArray(1, 2, 5, 10, 50);
alert(arr.isEmpty()); // false
let filteredArr = arr.filter(item => item >= 10);
alert(filteredArr); // 10, 50
alert(filteredArr.isEmpty()); // false
يرجى ملاحظة شيء مثير جدا للاهتمام. الأساليب المدمجة مثل filter وmap وغيرها – تُرجع كائنات جديدة من النوع الموروثPowerArray بالضبط. يستخدم التنفيذ الداخلي خاصية `مُنشئ 'الكائن لذلك.
في المثال أعلاه,
arr.constructor === PowerArray
عند استدعاء arr.filter () ، فإنه ينشئ داخليًا مجموعة جديدة من النتائج باستخدام “arr.constructor” بالضبط ، وليس Array الأساسي. هذا في الواقع رائع جدًا ، لأنه يمكننا الاستمرار في استخدام طرق `` PowerArray` بشكل أكبر على النتيجة.
بل وأكثر من ذلك ، يمكننا تخصيص هذا السلوك.
يمكننا إضافة مُصطلح ثابت خاص Symbol.species إلى الفصل. إذا كان موجودًا ، فيجب أن يُرجع المُنشئ الذي ستستخدمه JavaScript داخليًا لإنشاء كيانات جديدة في خريطة وفلتر وما إلى ذلك.
إذا كنا نرغب في استخدام طرق مضمنة مثل الخريطة أوالفلتر لإرجاع المصفوفات العادية ، فيمكننا إرجاع المصفوفة في` الرمز المحدد '، كما يلي:
class PowerArray extends Array {
isEmpty() {
return this.length === 0;
}
// built-in methods will use this as the constructor
static get [Symbol.species]() {
return Array;
}
}
let arr = new PowerArray(1, 2, 5, 10, 50);
alert(arr.isEmpty()); // false
// filter creates new array using arr.constructor[Symbol.species] as constructor
let filteredArr = arr.filter(item => item >= 10);
// filteredArr is not PowerArray, but Array
alert(filteredArr.isEmpty()); // Error: filteredArr.isEmpty is not a function
كما ترى ، الآن يُرجع .filter`` Array. لذلك لم يتم تمرير الدالة الموروثة أكثر من ذلك.
تعمل مجموعات أخرى ، مثل Map وSet ، على حد سواء. كما أنهم يستخدمون Symbol.species.
لا وجود للتوريث الثابت في كل المدمجات
لها دوال ثابتة خاصة بها ، مثل Object.keys ،Array.isArray إلخ.
كما نعلم بالفعل ، تمتد الفصول الدراسية الأصلية لبعضها البعض. على سبيل المثال ، Array يمتدObject.
عادة ، عندما تمد فئة واحدة أخرى ، يتم توريث كل من الأساليب الثابتة وغير الثابتة. تم شرح ذلك تمامًا في المقالة [] (info: static-properties-methods # statics-and-inheritance).
لكن الفصول المدمجة استثناء. لا يرثون إحصائيات عن بعضهم البعض.
على سبيل المثال ، يرث كل من Array وDate من Object ، لذا فإن نُسخهما تحتوي على طرق منObject.prototype. لكن Array. [[Prototype]] لا يشير إلى Object ، لذلك لا يوجد ، على سبيل المثال ،Array.keys ()(أوDate.keys ()) طريقة ثابتة.
إليك بنية الصورة لـ Date وObject:
كما ترى ، لا يوجد رابط بين التاريخ والكائن. إنهم مستقلون ، فقط يرث Date.prototype منObject.prototype.
هذا اختلاف مهم في الميراث بين الكائنات المضمنة مقارنة بما نحصل عليه مع extends ‘’.
التعليقات
<code>، وللكثير من السطور استخدم<pre>، ولأكثر من 10 سطور استخدم (plnkr, JSBin, codepen…)