قرأت مؤخرًا عبر الإنترنت عن تجربة شخص ما خلال مقابلة مع تاوباو، ثم وجدت أن هناك أشياء كثيرة لم أكن واضحًا بشأنها، لذلك كتبت بعض المقالات لتعميق فهمي لبعض القضايا.
السؤال المذكور في المقالة هو: كيف تقوم JavaScript بتنفيذ الميراث؟
سأشرح أدناه بعض الأساليب والأمثلة التي وجدتها عبر الإنترنت لتعميق انطباعي.
نحن نعلم أن الوظيفة في JavaScript متعددة الاستخدامات، بالإضافة إلى استخدامها لتعريفات الوظائف، يمكن استخدامها أيضًا لتعريفات الفئات.
يعد الوراثة في JavaScript غريبًا بعض الشيء، على عكس لغة C++ وبعض اللغات الموجهة للكائنات، فهي لا تحتوي على تعديلات للتحكم في الوصول مثل العامة والخاصة، ولا يوجد تطبيق أو رموز محددة أخرى للإشارة إلى الوراثة.
فيما يتعلق بوراثة فئات JavaScript، يمكنك الرجوع إلى المثال التالي.
انسخ رمز الكود كما يلي:
<نوع البرنامج النصي = "نص/جافا سكريبت">
وظيفة الشخص () {
//ملكيات
this.Gender = "أنثى";
هذا.العمر = 18؛
this.Words = "الصمت";
// طريقة
هذا. الصراخ = وظيفة () {
تنبيه ("سعيد! طريقة الفصل الأصلي")؛
}
}
// وراثة
وظيفةالمبرمج () {
this.base = Person;
}
Programmer.prototype = شخص جديد؛
// أضف طرقًا جديدة إلى الفئات الفرعية
Programmer.prototype.typeCode = function() {
تنبيه("أنا مبرمج! عامل مهاجر في مجال تكنولوجيا المعلومات، غير سعيد للغاية. طريقة الفئة الفرعية");
}
// مثال الاتصال
وظيفة قل مرحبا () {
var a = new Programmer();
تنبيه (a.Gender)؛ // استدعاء خصائص الفئة الأصل
a.shouting(); // استدعاء طريقة الفئة الأصل
a.typeCode(); // استدعاء طريقة الفئة الفرعية
}
sayHello();
</script>
في المثال أعلاه، تم الإعلان أولاً عن فئة شخص، والتي تحتوي على بعض السمات والطرق، ثم تم الإعلان عن فئة مبرمج، والتي لها سمة أساسية. هذه السمة ليست ضرورية، ولكن من أجل المواصفات والعثور على الكائنات فيها المستقبل يجب كتابة جميع الفئات الموروثة، ثم يتم نسخ فئة الشخص إلى كائن النموذج الأولي للمبرمج (النموذج الأولي)، وبالتالي يتم تحقيق وراثة الفئة.
محاكاة بعض مبادئ الطبقات والميراث في جافا سكريبت
في اللغات الموجهة للكائنات، نستخدم الفئات لإنشاء كائن مخصص. ومع ذلك، كل شيء في JavaScript هو كائن، فكيف يتم إنشاء كائن مخصص؟
يتطلب هذا إدخال مفهوم آخر - النموذج الأولي، يمكننا ببساطة اعتبار النموذج الأولي كقالب. الكائنات المخصصة التي تم إنشاؤها حديثًا هي جميعها نسخ من هذا القالب (النموذج الأولي) (في الواقع ليست نسخة ولكن رابط. إنه مجرد نوع من الارتباط). غير مرئية وتعطي الناس انطباعا بأنها نسخة).
دعونا نلقي نظرة على مثال لإنشاء كائن مخصص عبر النموذج الأولي:
انسخ رمز الكود كما يلي:
//المنشئ
وظيفة الشخص (الاسم، الجنس) {
this.name = name;
this.sex = sex;
}
// تحديد النموذج الأولي للشخص يمكن الرجوع إلى الخصائص الموجودة في النموذج الأولي بواسطة كائنات مخصصة.
نموذج الشخص = {
الحصول على الاسم: الوظيفة () {
إرجاع هذا. الاسم؛
},
الحصول على الجنس: وظيفة () {
إرجاع this.sex;
}
}
هنا نسمي الدالة Person مُنشئًا، وهي دالة تُنشئ كائنًا مخصصًا. يمكن ملاحظة أن JavaScript تحاكي وظائف الفئات من خلال المُنشئين والنماذج الأولية.
فيما يلي مثال يشرح بالتفصيل العمل المحدد الذي تقوم به JavaScript عند إنشاء كائن مخصص:
انسخ رمز الكود كما يلي:
var zhang = new Person("ZhangSan", "man");
console.log(zhang.getName()); // "ZhangSan"
var chun = new Person("ChunHua", "woman");
console.log(chun.getName()); // "ChunHua"
عند تنفيذ الكود var zhang = new Person("ZhangSan", "man")، يتم فعل الأشياء التالية داخليًا:
قم بإنشاء كائن فارغ (كائن جديد ()).
انسخ السمات (أزواج القيمة الرئيسية) في Person.prototype إلى هذا الكائن الفارغ (كما ذكرنا سابقًا، التنفيذ الداخلي ليس نسخة بل رابط مخفي).
قم بتمرير هذا الكائن إلى المنشئ من خلال الكلمة الأساسية هذه وقم بتنفيذ المنشئ.
قم بتعيين هذا الكائن للمتغير zhang.
تم إنجاز كل العمل.
لإثبات أن قالب النموذج الأولي لم يتم نسخه إلى الكائن الذي تم إنشاء مثيل له، ولكنه وسيلة للربط، يرجى الاطلاع على الكود التالي:
انسخ رمز الكود كما يلي:
وظيفة الشخص (الاسم، الجنس) {
this.name = name;
this.sex = sex;
}
Person.prototype.age = 20;
var zhang = new Person("ZhangSan", "man");
console.log(zhang.age); // 20
// تجاوز سمة العمر في النموذج الأولي
تشانغ.اج = 19؛
console.log(zhang.age); // 19
حذف zhang.age;
// بعد حذف عمر سمة المثيل، يتم الحصول على قيمة السمة هذه من النموذج الأولي مرة أخرى
console.log(zhang.age); // 20
في المثال أعلاه، إذا تم الحصول عليه فقط عن طريق النسخ، فلن يكون الكائن موجودًا بعد حذف سمة العمر، ومع ذلك، لا يزال من الممكن إخراج سمة العمر في المثال، أو سيتم الكتابة فوق القيمة السابقة، مما يشير إلى أننا تم حذف السمة التي تحمل الاسم نفسه في الفئة الفرعية فقط، ولا تزال سمة العمر في الفئة الأصلية موجودة في الكائن من خلال رابط غير مرئي.
كيفية تنفيذ الميراث البسيط في جافا سكريبت؟
يقوم المثال التالي بإنشاء فئة موظف ترث كافة الخصائص من النموذج الأولي من الشخص.
انسخ رمز الكود كما يلي:
وظيفة الموظف (الاسم والجنس ومعرف الموظف) {
this.name = name;
this.sex = sex;
this.employeeID = معرف الموظف؛
}
// قم بتوجيه النموذج الأولي للموظف إلى مثيل الشخص
// نظرًا لأن مثيلات الشخص يمكنها استدعاء الأساليب في النموذج الأولي للشخص، فيمكن لمثيلات الموظف أيضًا استدعاء جميع الخصائص في النموذج الأولي للشخص.
Staff.prototype = new Person();
الموظف.prototype.getEmployeeID = وظيفة () {
إرجاع this.employeeID;
};
var zhang = new member("ZhangSan", "man", "1234");
console.log(zhang.getName()); // "ZhangSan
حسنًا، ما ورد أعلاه هو بعض العمليات والأساليب المحددة لتنفيذ الوراثة في JavaScript.
بالطبع، لتلخيص، تعتمد آلية الميراث في JavaScript فقط على المحاكاة، بالمقارنة مع بعض اللغات الموجهة للكائنات، فهي خشنة ولها بعض العيوب، ومع ذلك، بشكل عام، لا يزال هذا لا يقلل من كفاءة مطوري الواجهة الأمامية . حماس.