الميراث في جافا سكريبت غريب للغاية. لا يمكن أن تنفذ ميراث الواجهة ويمكن أن يعتمد فقط على ميراث النموذج الأولي.
سلسلة النموذج الأولي
النموذج الأولي هو كائن. سيكون للمثال الذي تم إنشاؤه من خلال المنشئ مؤشر إلى النموذج الأولي للحصول على خصائص وطرق النموذج الأولي. وبهذه الطريقة ، يحتوي كائن المثيل على طريقة سمة المُنشئ وطريقة السمة للنموذج الأولي ، ثم يشير إلى النموذج الأولي للمُنشئ الذي يحتاج إلى ورثه إلى هذا المثيل ، بحيث يمكن ورث جميع أساليب السمة للمثيرة.
انظر الرمز التجريبي التالي:
// إعلان الطبقة الفائقة ، أضف الخصائص والأساليب ذات الصلة من خلال المُنشئين والنماذج الأولية Super () {this.property = true ؛ الفئة الفائقة واحصل على كل شيء في النوع الفرعي الفائق. console.log (easule.getSuperValue ()) ؛النموذج الأولي الافتراضي لجميع الوظائف هو مثيل للكائن ، وبالتالي فإن النموذج الأولي الافتراضي سيحتوي على مؤشر داخلي إلى Object.prototype.
استخدم مثيل و isProtypeOF لتحديد العلاقة بين النماذج الأولية والحالات:
مثيل مثيل الكائن ؛ object.prototype.isprototypeof (مثيل) ؛
عند استخدام سلاسل النموذج الأولي ، تحتاج إلى تحديد الطريقة بعناية. تحتاج الفئات الفرعية إلى إعادة كتابة طريقة أو تمديد SuperType ، ويجب وضعها بعد العبارة التي تحل محل النموذج الأولي ، بحيث يمكن أن يكون مفيدًا. بالإضافة إلى ذلك ، عند الوراثة من خلال سلسلة النموذج الأولي ، لا يمكنك استخدام الحرفيات الكائنات لإنشاء طريقة نموذجية ، والتي ستجاوز سلسلة النموذج الأولي:
...... subtype.prototype = new super () ؛ subtype.prototype = {....} ؛هذا يحل محل المؤشر للإشارة إلى الكائن الجديد ، وإعادة كتابة سلسلة النموذج الأولي.
طريقة الميراث لسلاسل النموذج الأولي معيب ، وهناك مشكلتان رئيسيتان:
1. من نموذج أولي يحتوي على قيمة نوع المرجع ، سيتم مشاركته بواسطة جميع الحالات.
كما هو مذكور في المقالة السابقة ، ستتم مشاركة سمات النموذج الأولي الذي يحتوي على قيم نوع المرجع بواسطة جميع الحالات. سيتم تعديل مثيل واحد وسيتغير الحالات الأخرى وفقًا لذلك. لذلك ، يجب تحديد السمات في المنشئ. عندما ترث سلسلة النموذج الأولي ، بغض النظر عما إذا كانت السمات الموجودة في الفئة الفائقة محددة في المُنشئ أو النموذج الأولي ، تصبح جميعها كائنات مثيل وترثها الفئات الفرعية ، وبالتالي لها تأثير على حالات الفئة الفرعية.
2. عند إنشاء مثيل من النوع الفرعي ، لا يمكن تمرير المعلمات إلى مُنشئ SuperType.
يشير ميراث سلسلة النموذج الأولي مباشرة إلى النموذج الأولي للفئة الفرعية إلى مثيل الفئة الفائقة ، وفي هذا الوقت ، يمكن تمرير المعلمات إلى الفئة الفائقة. ومع ذلك ، عندما تنشئ الفئة الفرعية مثيلًا ، يمكنها فقط نقل المعلمات إلى مُنشئ الفئة الفرعية ، ولكن ليس إلى مُنشئ الفئة الفائقة.
لذلك ، في التطبيقات العملية ، نادراً ما تستخدم سلاسل النموذج الأولي بمفردها.
بعض ممارسات التعليمات البرمجية ذات الصلة
تحديد سمة النموذج الأولي
الدالة hasprototypeproperty (كائن ، اسم) {اسم الإرجاع في الكائن &&! object.hasownproperty (name) ؛}باستخدام كائنات النموذج الأولي في البنائين
وظيفة person (name) {this.name = name ؛} person.prototype = {constructor: person ، sayname: function () {console.log (this.name) ؛ } ، toString: function () {}} ؛ var person1 = شخص جديد ('nicholas') ؛ var person2 = شخص جديد ('greg) ؛ console.log (person1 مثيل الشخص) ؛ // trueconsole.log (person1.constructor === Person) ؛ // trueconsole.log (person1.constructor === Person) ؛ // trueconsole.log (person1.constructor === Object) ؛ // falseconsole.log (person2 مثيل الشخص) ؛ // trueconsole.log (person2.constructor === Person) ؛ // trueconsole.log (person2.constructor === object) ؛ // خطأ شنيعالميراث الكائن
var person1 = {name: 'nicholas' ، sayname: function () {console.log (this.name) ؛ }} ؛ var person2 = object.create (person1 ، {name: {configable: true ، enumeries: true ، value: 'greg' ، crinable: true}}) ؛ person1.sayname () ؛ // nicholasperson2.sayname () ؛ // gregconsole.log (person1.hasownproperty ('sayname')) ؛ // trueconsole.log (person1.ispropertyof (person2)) ؛ // trueconsole.log (person2.hasownproperty ('sayname')) ؛ // خطأ شنيعوضع الوحدة النمطية
var person = (function () {var age = 25 ؛ function getAge () {return age ؛} function growolder () {age ++ ؛} return {name: 'nicholas' ، getage: getage ، growolder: grenolder} ؛} ()) ؛منشئ النطاق
PORSITION Person (name) {this.name = name ؛} person.prototype.sayname = function () {console.log (this.name) ؛} ؛ var person1 = person ('nicholas') ؛ console.log (person1 extueof person) ؛ // falseconsole.log (typeof person1) ؛ // undefinedconsole.log (name) ؛ // نيكولاس