الـ 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…)