هناك العديد من العلاقات الفوضوية في جافا سكريبت. سلسلة النطاق هي علاقة سلسلة أحادية الاتجاه ، وهي بسيطة وواضحة للغاية ؛ علاقة الدعوة لهذه الآلية معقدة بعض الشيء. أما بالنسبة للنموذج الأولي ، فهي علاقة ثلاثية بين النموذج الأولي ، والبروتو والمُنشئ. تستخدم هذه المقالة أولاً صورة لتوضيح المعنى ، ثم يشرح علاقة المثلث للنموذج الأولي بالتفصيل.
توضيح
مفهوم
العلاقة المعقدة في الصورة أعلاه تأتي بالفعل من سطرين من الكود
دالة foo () {} ؛ var f1 = new foo ؛【المنشئ】
الوظيفة المستخدمة لتهيئة الكائن الذي تم إنشاؤه حديثًا هي المنشئ. في المثال ، وظيفة foo () هي مُنشئ
【كائن مثيل】
الكائن الذي تم إنشاؤه بواسطة التشغيل الجديد للمشارك هو كائن مثيل. يمكنك استخدام مُنشئ واحد لبناء كائنات مثيل متعددة
الدالة foo () {} ؛ var f1 = new foo ؛ var f2 = new foo ؛ console.log (f1 === f2) ؛ // false【كائنات النموذج الأولي والنموذج الأولي】
يحتوي المُنشئ على خاصية النموذج الأولي الذي يشير إلى كائن النموذج الأولي لكائن المثيل. الكائنات المتعددة التي تم إنشاء مثيل لها بواسطة نفس المُنشئ لها نفس كائن النموذج الأولي. استخدم كائنات النموذج الأولي بانتظام لتحقيق الميراث
الدالة foo () {} ؛ foo.prototype.a = 1 ؛ var f1 = new foo ؛ var f2 = new foo ؛ console.log (foo.prototype.a) ؛ // 1console.log (f1.a) ؛ // 1console.log (f2.a) ؛ // 1console.log (f2.a) ؛【المنشئ】
يحتوي كائن النموذج الأولي على سمة مُنشأة تشير إلى وظيفة المنشئ المقابلة لكائن النموذج الأولي.
الدالة foo () {} ؛ console.log (foo.prototype.constructor === foo) ؛ // trueنظرًا لأن كائن المثيل يمكن أن يرث خصائص كائن النموذج الأولي ، فإن كائن المثيل يحتوي أيضًا على سمة المنشئ ، والتي تشير أيضًا إلى وظيفة المنشئ المقابلة لكائن النموذج الأولي.
الدالة foo () {} ؛ var f1 = new foo ؛ console.log (f1.constructor === foo) ؛ // true【proto】
يحتوي كائن المثيل على سمة proto التي تشير إلى كائن النموذج الأولي المقابل لكائن المثيل
الدالة foo () {} ؛ var f1 = new foo ؛ console.log (f1 .__ proto__ === foo.prototype) ؛ // trueيوضح
تم تقديم المفهوم ، والآن سنشرح العلاقة بالتفصيل.
دالة foo () {} ؛ var f1 = new foo ؛【الجزء 1: فو】
يتم إنشاء كائن مثيل F1 بواسطة التشغيل الجديد للمشارك FOO (). كائن النموذج الأولي للمنشئ FOO () هو foo.prototype ؛ يشير كائن مثيل F1 أيضًا إلى كائن النموذج الأولي foo.prototype من خلال سمة __proto__.
الدالة foo () {} ؛ var f1 = new foo ؛ console.log (f1 .__ proto === foo.prototype) ؛ // trueلا يحتوي كائن المثيل F1 نفسه على سمة مُنشئ ، ولكن يمكن أن يرث سمة المنشئ لكائن النموذج الأولي foo.prototype.
الدالة foo () {} ؛ var f1 = new foo ؛ console.log (foo.prototype.constructor === foo) ؛ // trueconsole.log (f1.constructor ==== foo) ؛ // trueconsole.log (f1.hasownproperty ('' convenructor ') ؛يوضح الشكل التالي تأثير وحدة التحكم لكائن المثيل F1
【الجزء 2: كائن】
Foo.Prototype هو كائن النموذج الأولي لـ F1 ، وهو أيضًا كائن مثيل. في الواقع ، يمكن اعتبار أي كائن كائن تم إنشاء مثيل له من خلال التشغيل الجديد لمؤسس الكائن (). لذلك ، فإن النمط foo.prototype هو كائن مثيل ، ومُنشئه هو كائن () وكائن النموذج الأولي هو كائن. وفقًا لذلك ، تشير خاصية النموذج الأولي لكائن المنشئ () إلى كائن كائن النموذج الأولي ؛ يشير خاصية proto لكائن مثيل foo.protype أيضًا إلى كائن كائن النموذج الأولي
الدالة foo () {} ؛ var f1 = new foo ؛ console.log (foo.prototype .__ proto__ === object.prototype) ؛ // trueيحتوي Object Object Foo.Protype نفسه على سمة المنشئ ، لذلك يتجاوز سمة المنشئ الموروثة من كائن النموذج الأولي.
الدالة foo () {} ؛ var f1 = new foo ؛ console.log (foo.prototype.constructor === foo) ؛ // trueconsole.log (object.prototype.constructor ==== Object) ؛ // trueconsole.log (foo.prototype.hasownproperty ('Constructor')) ؛ // trueconsole.log (foo.prototype.hasownproperty ('constructor')) ؛ // trueيوضح الشكل التالي تأثير وحدة التحكم لكائن المثيل foo.prototype
إذا كان Object.prototype هو كائن مثيل ، فما هو كائن النموذج الأولي الخاص به؟ والنتيجة لاغية. أعتقد أن هذا قد يكون أيضًا نتيجة لـ typeof null ، وهو أحد الأسباب التي تجعل "الكائن"
console.log (Object.prototype .__ proto__ === null) ؛ // true
【الجزء 3: الوظيفة】
كما ذكرنا سابقًا ، فإن الوظائف هي كائنات ، ولكن الكائنات ذات الوظائف الخاصة. يمكن اعتبار أي وظيفة نتيجة للتثبيت من خلال التشغيل الجديد لمؤسسة الوظيفة ().
إذا تم اعتبار الوظيفة FOO ككائن مثيل ، فإن مُنشئها هو الدالة () وكائن النموذج الأولي الخاص به هو وظيفة. وبالمثل ، فإن مُنشئ كائن الوظيفة هو أيضًا الوظيفة () ، وكائن النموذج الأولي الخاص به هو وظيفة.
الدالة foo () {} ؛ var f1 = new foo ؛ console.log (foo .__ proto__ === وظيفة.تشير سمة مُنشئ دالة كائن النموذج الأولي. لا يوجد لدى كائن المثيل و FOO سمة المنشئ ، ومن الضروري أن يرث سمة المنشئ لوظيفة كائن النموذج الأولي.
function foo () {} ؛ var f1 = new foo ؛ console.log (function.prototype.constructor === وظيفة) ؛ // trueconsole.log (foo.constructor ==== وظيفة) ؛ // trueconsole.log (foo.hasownproperty ('borndructor') ؛ وظيفة) ؛ // trueconsole.log (Object.hasownProperty ('Constructor')) ؛ // falseيمكن اعتبار جميع الوظائف ككائنات مثبتة للتشغيل الجديد لوظيفة المنشئ (). بعد ذلك ، يمكن اعتبار الوظيفة نتيجة لاستدعاء تشغيل تشغيلها الجديد.
لذلك ، إذا كانت الوظيفة كائن مثيل ، فإن مُنشئها هو وظيفة ، وكائن النموذج الأولي هو دالة.
console.log (function .__ proto__ ==== وظيفة. النموذج) ؛ // trueconsole.log (function.prototype.
إذا كان النمط النمطية هو كائن مثيل ، فما هو كائن النموذج الأولي الخاص به؟ كما كان من قبل ، يمكن اعتبار جميع الكائنات نتيجة إنشاء مثيل للتشغيل الجديد لمؤسس الكائن (). لذلك ، فإن كائن النموذج الأولي للوظائف. النمط النمط هو Object.protype ، ووظيفة النموذج الأولي هي كائن ()
console.log (function.prototype .__ proto__ === object.prototype) ؛ // true
يقدم الجزء الثاني أن كائن النموذج الأولي للكائن.
console.log (Object.prototype .__ proto__ === null) ؛ // true
لخص
【1】 الوظيفة (الوظيفة هي أيضًا وظيفة) هي نتيجة لوظيفة جديدة ، بحيث يمكن استخدام الوظيفة ككائن مثيل ، ومُنشئها هو وظيفة () ، وكائن النموذج الأولي هو دالة.
【2】 الكائنات (الوظائف هي أيضًا كائنات) هي نتيجة كائن جديد ، بحيث يمكن استخدام الكائن ككائن مثيل ، ومُنشئه هو كائن () ، وكائن النموذج الأولي هو كائن.
【3】 Objec