أول من أمس، ترك أحد مستخدمي الإنترنت رسالة يسألني فيها ما هو الكائن؟ وبما أنني كنت مشغولاً بإعادة إنشاء عنصر تحكم TreeView خلال اليومين الماضيين، فأنا آسف حقًا لأنني لم أرد في الوقت المناسب. خذ بعض الوقت اليوم لإلقاء نظرة على ما هو الكائن بالضبط في JavaScript؟ ما هي العلاقة بين الكائن والوظيفة؟ وأرحب بالتصحيحات إذا كنت مخطئا.
على الرغم من أنها رسالة خاصة، إلا أنني أتمنى ألا تلومني إذا أرسلتها بشكل مجهول، وإذا كان هناك أي خطأ، فيرجى إبلاغي بذلك.
ما هو بالضبط كائن js؟
في البداية اعتقدت أن الكائن هو النموذج الأولي لجميع الكائنات في js.
لكن: التنبيه (Object.constructor) يعرض الوظيفة الوظيفة ...
هذا يعني أن النموذج الأولي للكائن هو الوظيفة؟
ولكن المشكلة تأتي مرة أخرى:
Function.prototype.read=function(){};// النموذج الأولي للوظيفة الموسعة
for(var i in Object)alert(i)// يعرض القراءة، مما يؤكد أيضًا أن النموذج الأولي للكائن هو الوظيفة
Object.prototype.read=function(){};// يوسع النموذج الأولي للكائن
for(var i in Function)alert(i)// عرض القراءة، النموذج الأولي للوظيفة هو كائن؟ ؟ ؟ ؟
ما هو الكائن بالضبط؟ هل الكائن والوظيفة كفئات نفس الشيء؟
لقد خلط هذا الصديق بين المُنشئ والنموذج الأولي والوظيفة لأن JavaScript هي لغة قائمة على الكائنات (لا تحتوي JavaScript على فئات مناسبة). من الممكن في الواقع أن نقول أن الكائن هو النموذج الأولي لجميع الكائنات، ولكن هذا يشير إلى مفهوم النموذج الأولي في نموذج النموذج الأولي في نمط التصميم، وليس ميزة لغة النموذج الأولي في JavaScript والتي تسمى Object.prototype.
إذن ما هو الكائن بالضبط في JavaScript؟ يقول Script56.chm (البرنامج التعليمي الرسمي لـ M$): يوفر وظائف مشتركة لجميع كائنات JScript. حسنا، هل تفهم؟ لأنني يجب أن أفهم، ولكن لا يزال يبدو أنني لا أفهم @_@. إذا نظرنا إلى بنية البيانات، فإن الكائن (مثال للكائن) عبارة عن مجموعة غير مرتبة، وهي بنية مشابهة للخريطة في C++، وقابلة للتجزئة في C#، وهاشماب في Java. وتحتوي على قيمة بدائية يعينها نظام لغة جافا سكريبت ماذا تعني؟ الكائن لديه طريقة تسمى valueOf، وتتمثل مهمتها في إرجاع القيمة الأصلية للكائن المحدد. يمكن العثور على هذا أيضًا في Script56، ويوجد أيضًا جدول يسرد نتائج إرجاع قيمة كائنات النظام. بمعنى آخر، الكائنات مثل Array وBoolean وDate وFunction وNumber وما إلى ذلك تأتي في الواقع من Object، وأسلافها كلها Object. إنها تمثل ميزات لغة مختلفة، على سبيل المثال، يحتوي Array على سمة طول تتم إدارتها تلقائيًا، ويحتوي Boolean فقط على قيم صحيحة أو خاطئة، ويمثل Date بنية زمنية، ويمكن تشغيل Function، كل هذه الإمكانيات مقدمة لها حسب نوعها الأصلي (valueOf ). الكائن هو في الواقع مجرد مفهوم. تعتمد لغة JavaScript على الكائنات، مما يعني أن جميع الأنواع المضمنة يتم استخلاصها من مجموعة من الأساليب والخصائص الشائعة (وتسمى أيضًا السلوكيات والحالات). هذه الخصائص هي Object. في الواقع، الكائن ليس مفيدًا جدًا في البرمجة، فنحن جميعًا نستخدم كائن مثيل للكائن، ثم نستخدم ميزة تجميع الكائن (توسيع) لتوسيع الكائن ليصبح ما نريده. بالنسبة إلى Object.prototype، فهو في الواقع ليس مفيدًا جدًا، لأن كل نوع محدد له نموذجه الأولي الخاص به، ومعظم أساليب النموذج الأولي التي نضيفها مخصصة لأنواع معينة.
بالإضافة إلى النموذج الأولي، يحتوي الكائن أيضًا على سمة مهمة جدًا - المُنشئ. يُستخدم هذا الشيء لإكمال توسيع الكائن الذي ذكرته سابقًا وهو أيضًا الأساس الذي نستخدمه لمحاكاة OOP. نظرًا لأن كل شيء في JavaScript هو كائن، فإن المُنشئ أيضًا هو، ولكن نوعه الأصلي هو Function (قم بتشغيل Object.constructor.valueOf() للحصول على: function Function() { [native code] }). بالطبع، على العكس من ذلك، ليست كل كائنات JavaScript لها خاصية مُنشئ، وبعض الكائنات المضمنة لا تحتوي على مُنشئ.
فيما يتعلق بالعلاقة بين الكائن والوظيفة، أعتقد أن هذا ليس رمز اختبار جيدًا: Function.prototype.read=function(){};// النموذج الأولي للوظيفة الموسعة
for(var i in Object)alert(i)// يعرض القراءة، مما يؤكد أيضًا أن النموذج الأولي للكائن هو الوظيفة
Object.prototype.read=function(){};// يوسع النموذج الأولي للكائن
for(var i in Function)alert(i)// عرض القراءة، النموذج الأولي للوظيفة هو كائن؟
تُستخدم هذه الأسطر الأربعة من التعليمات البرمجية لشرح مبدأ النموذج الأولي لجافا سكريبت ومحاكاة طريقة وراثة النموذج الأولي لبرمجة OO. ومع ذلك، لا يمكنها شرح العلاقة بين الكائن والوظيفة بوضوح: (على العكس من ذلك، سوف يخدعون الجمهور،
دعونا نصف بإيجاز كل وظيفة من أنواع الكائنات المختلفة في JavaScript:
الكائن الأصلي: الكائنات التي توفرها لغة JavaScript والتي لا تعتمد على مضيف التنفيذ، بعضها عبارة عن كائنات مدمجة، مثل Global وMath؛ وبعضها يتم إنشاؤه واستخدامه في بيئة تشغيل البرنامج النصي، مثل: Array، Boolean ، التاريخ، الوظيفة، الرقم، الكائن، RegExp، خطأ.
كائن مدمج: الكائنات المدمجة التي توفرها لغة JavaScript والتي لا تعتمد على مضيف التنفيذ، مثل الكائنات الشاملة والرياضية، كلها كائنات أصلية.
كائن مضيف: أي كائن توفره لغة JavaScript ويعتمد على البيئة المضيفة، جميع كائنات الكائنات غير الأصلية هي كائنات مضيفة، مثل: window في IE، ومثيل wscript في WScript، وأي فئة أنشأها المستخدم.