ما هو النموذج الأولي؟ النموذج الأولي هو مفهوم لم نذكره في التعلم الأساسي لـ JS. النموذج الأولي هو مصطلح عام يشمل بشكل أساسي كائن النموذج الأولي (النموذج الأولي) , النموذج الأولي للكائن (__proto__) , سلسلة النموذج الأولي انتظر، يتم أيضًا طرح هذه المفاهيم بشكل شائع في المقابلات وفقًا للإحصاءات، ستساعدك هذه المقالة على فهم المعرفة ذات الصلة بالنماذج الأولية وإتقانها، حتى لا تشعر بالحيرة بعد الآن.
لقد درسنا العديد من اللغات الموجهة للكائنات، مثل Java وC++ وما إلى ذلك، ولكن JavaScript كانت استثناءً قبل ES6، إذًا كيف قمنا بإنشاء الكائنات من قبل؟ اتضح أنه قبل ES6، استخدمنا المنشئات لإنشاء كائنات تم إنشاء مثيل لها. المنشئ عبارة عن وظيفة خاصة تحتوي على الخصائص العامة للكائن، ومن المنطقي استخدامه مع الجديد .
<script> function Animal(name,age){ // الحرف الأول من اسم المنشئ مكتوب بأحرف كبيرة this.name=name; this.age=age; this.eat=function(){ console.log("أنا آكل"); } } var dog=new Animal('Wangcai',3) // ليتم استخدامه مع الجديد لإنشاء كائن console.log(dog.name); console.log(dog.age); أكل الكلب () </script>
<script>. وظيفة الحيوان (الاسم والعمر) { this.name=name; this.age=age; } var dog=new Animal('Wangcai',3) console.log(dog.name); console.log(Animal.name); </script>
له وظيفة الحيوان (الاسم والعمر) { this.name=name; this.age=age; } var dog=new Animal('Wangcai',3) لون الحيوان='أسود' console.log(Animal.color); console.log(dog.color); </script>
قبل البدء في شرح ماهية كائن النموذج الأولي، دعونا نشرح أولاً الحالة التي لا تزال هي فئة الحيوان الآن بعد المقارنة، وجدنا أنه تم إخراج خطأ، أي أن عناوين أنواع البيانات المعقدة مختلفة.
<النص البرمجي> وظيفة الحيوان (الاسم والعمر) { this.name=name; this.age=age; this.eat=function(){ console.log("أنا آكل"); } } var dog=new Animal('Wangcai',3) var cat=new Animal('Mimi',3) var pig=new Animal('humhem',3) فار فيش=حيوان جديد('جولو',3) فار خروف=حيوان جديد('咩咩',3) console.log(dog.eat==cat.eat); </script>
عندما نقوم بإنشاء كائن تم إنشاء مثيل له، ستقوم العملية الجديدة أولاً بإنشاء كائن جديد، ولكن أنواع البيانات المعقدة ستفتح مساحة للتخزين (الكائنات والأساليب)، مما يؤدي إلى فتحات لا حصر لها لنفس الطريقة في كتلة الذاكرة المنشئة. مما يسبب إهدارًا شديدًا للذاكرة
النموذج الأولي للمنشئ هو سمة داخل المُنشئ. السمة الخاصة به هي مؤشر يشير إلى كائن. يتم بعد ذلك استخدام الأساليب المخزنة في هذا الكائن لإنشاء مثيلات من خلال المنشئ يمكن استخدامها بشكل عام عند تحويل الكائنات، وليست هناك حاجة لفتح مساحات ذاكرة مكررة متعددة لأنواع بيانات معقدة متعددة متماثلة. من أجل حل مشكلة هدر الذاكرة المذكورة أعلاه، يمكن أيضًا تسميتها مباشرة بكائن النموذج الأولي.
الحل: نستخدم كائن النموذج الأولي لتخزين الطريقة العامة، ونسمح للكائن الذي تم إنشاء مثيل له باستدعاء الطريقة، ومقارنة ما إذا كان عنوان الاثنين هو نفسه
<script> وظيفة الحيوان (الاسم والعمر) { this.name=name; this.age=age; } Animal.prototype.eat=function(){ console.log("أنا آكل"); } var dog=new Animal('Wangcai',3) var cat=new Animal('Mimi',3) أكل الكلب () أكل القط () console.log(dog.eat==cat.eat); </script>
لقد وجدنا أنه لم يتم استدعاء هذه الطريقة بنجاح فحسب، بل كانت عناوين طريقتي الاتصال متماثلتين، مما أثبت أن نوع البيانات العامة المعقدة الخاصة بها يفتح فقط مساحة من الذاكرة، مما يقلل من عدد الطرق العامة المكتوبة المنشئ من قبل مشكلة هدر الموارد داخل الوظائف.
تتمثل وظيفة النموذج الأولي للكائن __proto__ في السماح لك بمعرفة سؤال: لماذا يمكن استخدام الطريقة المضافة إلى سمة النموذج الأولي للمنشئ عند إنشاء كائن؟ وذلك لأن كل كائن لديه سمة __proto__ (لاحظ أن هناك شرطتان سفليتان قبل وبعد هذه السمة هي أيضًا مؤشر يشير إلى النموذج الأولي لكائن النموذج الأولي للمنشئ المقابل له، وهو ما يفسر سبب إمكانية استدعاء الكائن الذي تم إنشاء مثيل له). كائن النموذج الأولي.
يجب أن نلاحظ أن وظيفة النموذج الأولي للكائن __protp__ هي فقط توفير اتجاه للبحث في المحتوى في كائن النموذج الأولي، ولا نحتاج إلى استخدامه، نحتاج فقط إلى تذكره يشير النموذج الأولي لكائن النموذج الأولي إلى
. سمة منشئ، لذلك يطلق عليه مُنشئ ويسمى مُنشئًا لأن هذه السمة تشير إلى المُنشئ المقابل نفسه، ويتم استخدامه بشكل أساسي لتسجيل المُنشئ الذي يشير إليه الكائن الذي تم إنشاء مثيل له
<script>.
وظيفة الحيوان (الاسم والعمر) { this.name=name; this.age=age; } Animal.prototype.eat=function(){ console.log("أنا آكل"); } var dog=new Animal('Wangcai',4) console.log(dog.__proto__.constructor); console.log(Animal.prototype.constructor); </script>
لقد وجدنا أن النتيجة المطبوعة هي بالفعل المنشئ نفسه