class في JavaScript

من موسوعة حسوب
مراجعة 15:36، 28 يناير 2018 بواسطة عبد اللطيف ايمش (نقاش | مساهمات) (استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

التصريح عن الصنف (class declaration) يؤدي إلى إنشاء صنف جديد له اسمٌ معيّن يستخدم الوراثة عبر سلسلة prototype.

يمكنك أيضًا تعريف الأصناف عبر تعابير تعريف الأصناف (class expression)، لكن التصريح عن الصنف بهذه الطريقة يختلف عن استخدام تعابير تعريف الأصناف في أنَّه لا يسمح بإعادة التصريح عن الصنف مرةً أخرى، وسيرمي (throw) خطأً إن حاولنا ذلك.

البنية العامة

class name [extends] {
  // محتويات الصنف
}

الوصف

كما في تعابير تعريف الأصناف، ستُنفَّذ التعابر البرمجية الموجودة ضمن الصنف في نمط strict، لاحظ أنَّ الخاصية (property) التي تُشير إلى الدالة البانية هي اختيارية.

لا يمكن استخدام الأصناف المُصرَّح عنها عبر تعابير التصريح عن الأصناف قبل تعريفها (على النقيض من تعابير التصريح عن الدوال).

أمثلة

تصريح بسيط عن صنف

سنُعرِّف في المثال الآتي صنفًا باسم Polygon ثم أنشأنا صنفًا مشتقًا منه باسم Square، لاحظ أنَّ الدالة super()‎ التي استعملناها في الصنف Square لا يمكن أن تُستخدَم إلا في الدوال البانية، ويجب استدعاؤها قبل استخدام الكلمة المحجوزة this.

class Polygon {
  constructor(height, width) {
    this.name = 'Polygon';
    this.height = height;
    this.width = width;
  }
}

class Square extends Polygon {
  constructor(length) {
    super(length, length);
    this.name = 'Square';
  }
}

محاولة التصريح عن الصنف مرتين

محاولة إعادة التصريح عن الصنف ستؤدي إلى رمي TypeError:

class Foo {};
class Foo {}; // Uncaught TypeError: Identifier 'Foo' has already been declared

لاحظ أنَّ الخطأ نفسه سيظهر لو كان الصنف مُعرَّفًا عبر تعابير تعريف الأصناف (class expression):

var Foo = class {};
class Foo {}; // Uncaught TypeError: Identifier 'Foo' has already been declared

دعم المتصفحات

الميزة Chrome Firefox Internet Explorer Opera Safari
الدعم الأساسي 42 45 لا نعم 10.1

مصادر ومواصفات