١٥ ديسمبر ٢٠٢١

Class توريث ال

توريث الclass هو وسيلة لفئة واحدة لتمديد فئة أخرى.

حتى نتمكن من إنشاء وظائف جديدة على رأس القائمة.

الكلمة الرئيسية “يمتد”

لنفترض أن لدينا فئة Animal:

class Animal {
  constructor(name) {
    this.speed = 0;
    this.name = name;
  }
  run(speed) {
    this.speed = speed;
    alert(`${this.name} runs with speed ${this.speed}.`);
  }
  stop() {
    this.speed = 0;
    alert(`${this.name} stands still.`);
  }
}

let animal = new Animal('My animal');

إليك كيفية تمثيل كائن “الحيوان” وفئة “الحيوان” بشكل رسومي:

… ونود إنشاء “أرنب من الدرجة” آخر.

نظرًا لأن الأرانب حيوانات ، يجب أن تستند فئة “الأرانب” إلى “الحيوانات” ، وأن تكون قادرة على الوصول إلى الأساليب الحيوانية ، حتى تتمكن الأرانب من القيام بما يمكن أن تفعله الحيوانات “العامة”.

بناء الجملة لتمديد فئة أخرى هو: class child Extended Parent.

لنقم بإنشاء “أرنب الطبقة” الذي يرث من “الحيوان”:

class Rabbit extends Animal {
  hide() {
    alert(`${this.name} hides!`);
  }
}

let rabbit = new Rabbit("White Rabbit");

rabbit.run(5); // White Rabbit runs with speed 5.
rabbit.hide(); // White Rabbit hides!

Object of Rabbit class have access both to Rabbit methods, such as rabbit.hide(), and also to Animal methods, such as rabbit.run().

داخليًا ، تعمل الكلمة الرئيسية `` الموسعة ‘’ باستخدام ميكانيكا النموذج القديم الجيدة. يقوم بتعيين "Rabbit.prototype. [[Prototype]]إلى "Animal.prototype. لذلك ، إذا لم يتم العثور على طريقة في Rabbit.prototype ، فإن JavaScript تأخذها منAnimal.prototype.

على سبيل المثال ، للعثور على طريقة rabbit.run ، يتحقق المحرك (من أسفل إلى أعلى في الصورة):

  1. كائن “الأرنب” (ليس له “تشغيل”).
  2. نموذجها الأولي ، وهو “Rabbit.prototype” (به “إخفاء” وليس “تشغيل”).
  3. نموذجها الأولي ، أي (بسبب “يمتد”) “Animal.prototype” ، الذي يحتوي في النهاية على طريقة “run”.

كما يمكننا أن نتذكر من الفصل <info: original-prototypes> ، فإن JavaScript نفسها تستخدم الوراثة النموذجية للكائنات المدمجة. على سبيل المثال Date.prototype. [[Prototype]] هو Object.prototype. هذا هو السبب في أن التواريخ يمكنها الوصول إلى طرق الكائنات العامة.

يسمح بأي تعبير بعد

يسمح بناء جملة الصنف بتحديد ليس فئة فقط ، ولكن أي تعبير بعد “يمتد”.

على سبيل المثال ، استدعاء دالة ينشئ الفئة الأصل:

function f(phrase) {
  return class {
    sayHi() { alert(phrase); }
  };
}

class User extends f("Hello") {}

new User().sayHi(); // Hello

هنا يرث مستخدم class من نتيجةf ("Hello").

قد يكون ذلك مفيدًا لأنماط البرمجة المتقدمة عندما نستخدم الدالات لإنشاء فئات اعتمادًا على العديد من الشروط ويمكن أن ترثها.

تجاوز دالة

الآن دعنا نمضي قدمًا ونستبدل إحدى الطرق. افتراضيًا ، يتم أخذ جميع الطرق غير المحددة في “class Rabbit” مباشرةً “كما هي” من "class Animal`.

ولكن إذا حددنا طريقتنا الخاصة في “أرنب” ، مثل stop () ، فسيتم استخدامها بدلاً من ذلك:

class Rabbit extends Animal {
  stop() {
    // ...now this will be used for rabbit.stop()
    // instead of stop() from class Animal
  }
}

عادة لا نريد استبدال طريقة رئيسية تمامًا ، ولكن بدلاً من ذلك نبني عليها لاستبدالها أو توسيع وظائفها. نفعل شيئًا في طريقتنا ، ولكن استدعاء الطريقة الأم قبل / بعدها أو في العملية.

توفر الفصول كلمة رئيسية `` فائقة ‘’ لذلك.

  • super.method (...) لاستدعاء طريقة أصل.
  • ``super (…)`لاستدعاء مُنشئ أصل (داخل مُنشئنا فقط).