JavaScript هي لغة البرمجة الثانية التي توصلت إليها بعد لغة C. خلال عطلتي الصيفية ، وجدت برمجة JavaScript المكتوبة الصينية في المكتبة. في ذلك الوقت ، كنت تقريبًا مبتدئًا في البرمجة. بالإضافة إلى ذلك ، لم يذكر الكتاب آلية البرمجة لـ JavaScript على الإطلاق ، وكانت هناك بعض الكلمات المضللة. لطالما تعرضت لسوء فهم عميق لجافا سكريبت ، معتقدين أن جافا سكريبت هي مجرد لغة موجهة نحو الكائنات التي تعمل على المتصفح. سأكتب هذا المقال المربك ويسيء فهمه في جافا سكريبت. بطبيعة الحال ، نظرًا للمستوى المحدود للمؤلف وعدم وجود خبرة في مجال التنمية ، هناك إغفال حتما ، وآمل أن يتم إجراء النقد والتصحيح.
كائنات JavaScript
ما هو الكائن
يمكن رؤية الكلمة الرئيسية الجديدة في كل مكان في كود JavaScript ، وهو أمر سهل إساءة فهم أن JavaScript هي لغة تعتمد على ميراث الفصل ، تمامًا مثل Java. ولكن هذا ليس هو الحال. لا توجد فصول في JavaScript. إذن ما هو كائن JavaScript الذي ليس فئة؟ بمعنى ما ، كائنات javaScript هي قواميس (جداول التجزئة) في بيثون ، وهي في الواقع أزواج ذات قيمة رئيسية مماثلة لهذا:
Me = {"fisrtname": "Seek" ، "LastName": "Truth" ، "getName": function () {return this.firstName+this.lastname ؛ // هذا يعادل مؤشر لهذا الكائن}}هذا سوء فهم إلى حد ما. عندما رأيت ذلك لأول مرة ، شعرت ببعض غير مفهوم ، لكنني ما زلت أشعر أنه من المعقول استخدامه بعناية. يمكننا استخدام المشغل [] للحصول على عناصر مثل Python ، أو استخدام. المشغل للحصول على العناصر:
me.firstName // => SeekMe ["lastName"] // => trustme.getName () // => SeekTruth
مشغل جديد
نظرًا لعدم وجود فصل في JavaScript ، فماذا يفعل المشغل الجديد؟ هذا هو واحد من أكثر الجوانب المضللة لتصميم JavaScript. JavaScript هي لغة برمجة وظيفية. الوظائف في JavaScript هي مواطن من الدرجة الأولى ، والوظائف في JavaScript هي أيضًا كائنات. سيتم إضافة كائنات الوظيفة إلى سمات الاتصال عند إنشائها. ما هو أكثر من مأزق هو أن هناك طريقتان لدعوة وظائف JavaScript. أحدهما هو الاتصال بالكلمة الرئيسية الجديدة ، والآخر هو الاتصال بدون الكلمة الرئيسية الجديدة. السابق سيعيد كائنًا ، وسيقوم الأخير بإرجاع محتويات بيان الإرجاع. النظر في الوظيفة التالية:
وظيفة obj (name) {this.name = name ؛ اسم العودة ؛}إذا استخدمنا المشغل الجديد للاتصال:
OBJ = New OBJ ("SeekTruth") // OBJ سيكون كائنًا: {"name": "SeekTruth"}
إذا اتصلنا مباشرة:
OBJ = OBJ ("SeekTruth") // OBJ ستكون سلسلة: "SeekTruth"
إنه بالفعل تصميم صعب للغاية. عندما ندعو ، نحتاج إلى تمييز ما إذا كنا بحاجة إلى استخدام جديد. بشكل عام ، ستبدأ الوظائف التي تحتاج إلى استخدام الكلمة الرئيسية الجديدة بالرحمة.
شيء آخر صعب هو أنه إذا كانت قيمة الإرجاع التي تم إرجاعها كائنًا:
وظيفة obj (name) {this.name = name ؛ يعود {}؛}وبهذه الطريقة ، بغض النظر عما إذا كنا ندعو المشغل الجديد أم لا ، سنقوم بإرجاع القيمة في عبارة الإرجاع:
OBJ جديد ("SeekTruth") // => {} obj ("SeekTruth") // => {}ماذا بحق الجحيم مصمم ...
الميراث الكائن
النموذج الأولي
كما ذكرنا سابقًا ، لا يوجد فصل في JavaScript ، فكيف تنفذ جافا سكريبت الميراث؟ الجواب من خلال سلسلة النموذج الأولي. في JavaScript ، كل كائن لديه نموذج أولي. عند إنشاء كائن ، إذا لم يتم تحديده ، فإن النموذج الأولي الموروث بواسطة الكائن هو كائن. سوف يرث كائن الوظيفة الوظيفة. النمط (function.prototype كائن موروثة. النموذج):
Object.prototype // => {} function.prototype // => [function]يمكننا عرض النموذج الأولي للكائن من خلال معرفة __proto__ للكائن:
a = {} a .__ proto__ // => {}JavaScript يطبق الميراث من خلال تحديد النموذج الأولي للكائن. هناك ثلاث طرق رئيسية لتحديد النموذج الأولي للكائن. أحدهما هو الإشارة إلى النموذج الأولي في المُنشئ ، والثاني هو تعديل سمة __proto__ للكائن مباشرة ، والثالث هو استخدام وظيفة الكائن. دعونا نلقي نظرة عليه بدوره.
حدد النموذج الأولي في المنشئ
يمكننا تحديد النموذج الأولي للكائن في المنشئ:
Me = {"FirstName": "Seek" ، "LastName": "Truth" ، "getName": function () {return this.firstName+this.lastname ؛ // هذا يعادل مؤشر لهذا الكائن}} وظيفة OBJ (name) {this.firstName = name ؛ هذا .__ proto__ = me ؛ // حدد النموذج الأولي ككائن ME}بعد تحديد النموذج الأولي ، يمكننا الوصول إلى خصائص النموذج الأولي بعد إنشاء كائن جديد:
OBJ = OBJ جديد ("foo") ؛ // => {firstName: 'foo'} obj.firstName // => fooobj.lastname // => trustoBj.getName () // => "footRuth"عند الوصول إلى كائن ، ستحاول أولاً العثور على الخاصية في الكائن المعدل. إذا لم يكن كذلك ، عد إلى النموذج الأولي للبحث حتى Object.prototype. إذا قمنا بإعادة كتابة الخصائص (الأساليب) في النموذج الأولي في كائن جديد ، فحينئذ نستخدمه ، فإن الخصائص المكتوبة حديثًا (الأساليب) ستعمل على الكتابة فوق التعريف في النموذج الأولي ، والذي يشبه إلى حد ما التحميل الزائد للوظيفة في لغة قائمة على الفصل.
لاحظ أنه إذا تغيرت خاصية اسم LastName الخاصة بكائن النموذج الأولي ، لأن كائن OBJ يبحث عن خصائص في النموذج الأولي ، فإن خاصية اسم LastName لكائن OBJ ستتغير أيضًا:
me.lastname = "me" obj.lastname // => "me" obj.getName () // => "foome"
تغيير النموذج الأولي للكائن مباشرة
يمكننا أيضًا تحديد (تغيير) النموذج الأولي للكائن:
obj2 = {} obj2 .__ proto__ = meObj2.firstName // => sequobj2.lastname // => "me" obj2.getName () // => "seekme"استخدم وظيفة الكائن
على الرغم من أن أول طريقتين يمكن أن تحل المشكلة ، فإن هاتين الطريقتين للكتابة ليست أنيقة ، لأن JavaScript ليست لغة قائمة على الفصل ، ومن السهل إساءة فهم طريقة الكتابة الأولى. يعتقد Crockford ، مؤلف كتاب Essence of JavaScript ، أنه يجب ألا يظهر New في لغة JavaScript ، ويوصى به استخدام الكائن. استخدام وظيفة الكائن.
obj3 = object.create (me) // قم بإنشاء كائن جديد معي كنموذج أولي obj3.firstName // => seekobj3.lastname // => "me" obj3.getName () // => "SeekMe"
OBJ3 = object.create (ME) يعادل OBJ2 = {} ؛ obj2.proto = me ، ولكن الأول مكتوب بشكل أكثر أناقة وأسهل للفهم.
لخص
كلغة برمجة قائمة على النموذج الأولي والوظيفي ، تتمتع JavaScript بالعديد من الأناقة والقوة في التصميم ، ولكن في نفس الوقت لديها العديد من الخبث والمخاطر. بالنسبة للأكثر ، JavaScript هي أيضًا اللغة التي يساء فهمها. بعد تعلم آلية الميراث للكائن في JavaScript ، أشعر أن مستواي قد تحسن كثيرًا.
المناقشة الموجزة أعلاه لكائنات JavaScript والميراث هي كل المحتوى الذي أشاركه معك. آمل أن يعطيك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.