ملخص مخطط لإنشاء كائنات في جافا سكريبت
** JavaScript ينشئ نمط الكائن:
كائن حرفي
نموذج المصنع
وضع المنشئ
وضع النموذج الأولي
الجمع بين النمط النموذجي ونمط النموذج الأولي
النموذج الأولي الوضع الديناميكي
**
تحتوي معظم اللغات الموجهة نحو الكائنات على مفهوم الفصل ، حيث يمكن من خلالها إنشاء كائنات متعددة بنفس الأساليب والسمات. على الرغم من من الناحية الفنية ، فإن JavaScript هي لغة موجهة نحو الكائن ، إلا أن JavaScript لا تتمتع بمفهوم الفئات ، إلا أن كل شيء هو كائن. أي كائن هو مثيل لنوع مرجعي معين ويتم إنشاؤه من خلال أنواع المراجع الموجودة ؛ يمكن أن يكون النوع المرجعي أصليًا أو مخصصًا.
1. الكائن الحرفي
var person = {name: 'nicholas' ؛ العمر: "22" ؛ الوظيفة: "Software Engineer" Seally: function () {alter (this.name) ؛ }}في المثال ، يتم إنشاء كائن يدعى الشخص ويتم إضافة ثلاث سمات (الاسم والعمر والوظيفة) وطريقة (sayName ()). يتم استخدام طريقة sayname () لعرض قيمة this.name (تم حلها كـ profer.name).
يمكن استخدام حرفيات الكائنات لإنشاء كائن واحد ، ولكن هذه الطريقة لها عيب واضح: إنشاء العديد من الكائنات باستخدام الواجهة نفسها سيؤدي إلى إنتاج الكثير من التعليمات البرمجية المكررة.
2. نموذج المصنع
نمط المصنع هو نمط تصميم معروف في مجال هندسة البرمجيات. يقوم نمط المصنع بإجراء عملية إنشاء كائنات محددة ويستخدم وظائف لتغليف تفاصيل إنشاء كائنات ذات واجهات محددة.
دالة CreatePerson (الاسم ، العمر ، الوظيفة) {var o = كائن جديد {} ؛ O.Name = name ؛ O.AGE = العمر ؛ O.Job = Job ؛ O.SayName = function () {Alert (this.name) ؛ } ؛ return o ؛} var person1 = createPerson ("Nicholas" ، 22 ، "Software Engineer") ؛ var person2 = creatperson ("Greg" ، 24 ، "student") ؛يمكن للدالة CreatePerson {} إنشاء كائن شخص يحتوي على جميع المعلومات اللازمة بناءً على المعلمات المقبولة. يمكن تسمية هذه الوظيفة بأوقات لا تحصى ، وفي كل مرة ستعيد كائن يحتوي على ثلاث خصائص وطريقة واحدة.
على الرغم من أن نموذج المصنع يحل مشكلة إنشاء كائنات مماثلة متعددة ، إلا أنه لا يحل مشكلة التعرف على الكائن (أي كيفية معرفة نوع الكائن).
3. وضع المنشئ
وظيفة الشخص (الاسم ، العمر ، الوظيفة) {this.name = name ؛ this.age = العمر ؛ this.job = Job ؛ this.sayname = function () {Alert (this.name) ؛ }} // إنشاء مثيل للشخص من خلال المشغل الجديد var person1 = شخص جديد ("Nicholas" ، 22 ، "Engineer") ؛ var person2 = شخص جديد ("Greg" ، 24 ، "الطالب") ؛ person1.sayname () ؛ //nicholasperson2.sayname () ؛ // جريجالفرق من نموذج المصنع هو
إنشاء كائن غير معروض
تعيين السمات والأساليب مباشرة لهذا الكائن
لا بيان العودة
لإنشاء مثيل جديد للشخص ، يجب عليك استخدام المشغل الجديد. 4 خطوات لاستدعاء المُنشئ:
إنشاء كائن جديد
قم بتعيين نطاق المنشئ لكائن جديد (يشير هذا إلى هذا الكائن الجديد)
قم بتنفيذ الرمز في المنشئ
إرجاع كائن جديد
جميع الكائنات التي تم إنشاؤها في هذا المثال هي حالتين من مثيلات الكائن والشخص. يمكن التحقق من ذلك من قبل عامل التشغيل.
التنبيه (person1 مثيل كائن) ؛ // صحيح
نمط المنشئ لديه أيضا مشاكله الخاصة. في الواقع ، سيتم إعادة إنشاء طريقة SayName مرة واحدة في كل حالة. تجدر الإشارة إلى أن الأساليب التي أنشأتها مثيلها ليست متساوية. يمكن أن يثبت الرمز التالي ذلك
التنبيه (person1.sayname == person2.sayname) ؛ // false
يمكن حل هذه المشكلة عن طريق تحريك الطريقة خارج المنشئ كدالة عالمية.
وظيفة الشخص (الاسم ، العمر ، الوظيفة) {this.name = name ؛ this.age = العمر ؛ this.job = Job ؛ } وظيفة seallyname () {Alert (this.name) ؛ }يمكن بالفعل استدعاء الوظائف العالمية التي تم إنشاؤها في العالم العالمي من خلال الحالات التي أنشأها الشخص ، وهو أمر غير واقعي بعض الشيء ؛ إذا احتاج الكائن إلى تحديد طريقة صحيحة للغاية ، فيجب تحديد العديد من الوظائف العالمية ، والتي تفتقر إلى التغليف.
4. وضع النموذج الأولي
تحتوي كل وظيفة تم إنشاؤها في JavaScript على خاصية النموذج الأولي ، وهي مؤشر لكائن ما ، يحتوي على خصائص وطرق يمكن مشاركتها بواسطة جميع الحالات من نوع معين (دع جميع مثيلات الكائن تشترك في خصائصها وطرقها)
وظيفة person () {} person.prototype.name = "Nicholas" ؛ person.prototype.age = 22 ؛ person.prototype.job = "Software Engineer" ؛ person.prototype.sayname () {Alert (this.name) ؛ } ؛ var person1 = new person () ؛ person1.sayname () ؛ //nicholasalert(person1.sayname == person2.sayname) ؛ // trueالرمز أعلاه يفعل هذه الأشياء:
تحديد شخص مُنشئ. تحصل وظيفة الشخص تلقائيًا على خاصية النموذج الأولي. تحتوي هذه الخاصية فقط على خاصية مُنشأة تشير إلى الشخص بشكل افتراضي.
أضف ثلاث خصائص وطريقة واحدة من خلال شخص
قم بإنشاء مثيل للشخص ، ثم اتصل بالطريقة sayname () على المثيل
استخدام منشئ الشخص وشخصي.
استخدام منشئ الشخص وشخصي.
يوضح الشكل العلاقة بين مُنشئ الشخص ، وخصائص النموذج الأولي للشخص ، وحالات شخص. person.prototype يشير إلى كائن النموذج الأولي ، person.prototype.constructor يشير إلى الشخص. بالإضافة إلى احتواء سمة المنشئ ، يحتوي كائن النموذج الأولي أيضًا على خصائص وطرق أخرى تمت إضافتها لاحقًا. يحتوي كل من الشخصان الشخصيان 1 و Person2 على عقار داخلي ، والذي يشير فقط إلى الشخص.
عملية استدعاء طريقة sayname ():
أبحث عن طريقة logName () على مثيل Person1 ، وجدت أنه لا توجد طريقة من هذا القبيل ، لذلك عدت إلى النموذج الأولي للشخص 1
ابحث عن طريقة Sayame () على النموذج الأولي لـ Person1. هناك هذه الطريقة ، لذلك تسمى الطريقة
استنادًا إلى عملية البحث هذه ، يمكننا منع المثيل من الوصول إلى سمة الاسم نفسه على النموذج الأولي عن طريق تحديد سمة الاسم نفسه في النموذج الأولي على المثيل. تجدر الإشارة إلى أن القيام بذلك لن يحذف سمة اسم نفس النموذج الأولي ، ولكنه سيمنع الوصول فقط من الوصول.
وظيفة person () {} person.prototype.name = "Nicholas" ؛ person.prototype.age = 22 ؛ person.prototype.job = "Software Engineer" ؛ person.prototype.sayname () {Alert (this.name) ؛ } ؛ var person1 = new person () ؛ var person2 = شخص جديد () ؛ person1.name = "Greg" ALERT (person1.name) // Greg يأتي من تنبيه المثيل (person2.name) // Nicholas يأتي من النموذج الأولياستخدم مشغل الحذف لحذف خصائص المثيل بالكامل
حذف الشخص 1
استخدم طريقة HasownProperty () لاكتشاف ما إذا كانت خاصية موجودة في مثيل أو نموذج أولي
وظيفة person () {} person.prototype.name = "Nicholas" ؛ person.prototype.age = 22 ؛ person.prototype.job = "Software Engineer" ؛ person.prototype.sayname () {Alert (this.name) ؛ } ؛ var person1 = new person () ؛ var person2 = شخص جديد () ؛ ALERT (person1 ، hasownproperty ("name")) ؛ // plage person1.name = "Greg" Alert (person1.name) // Greg from the evalue alert (person1 ، hasownproperty ("name")) ؛ Person1.name ؛ Alert (person1.name) // Nicholas من تنبيه النموذج الأولي (person1 ، hasownproperty ("name")) ؛ // falseيوضح الشكل التالي العلاقة بين الحالات والنماذج الأولية في مواقف مختلفة
بناء جملة النموذج الأولي البسيط
وظيفة person () {} person.prototype = {name: "Nicholas" ، العمر: 22 ، الوظيفة: "Software Engineer" ، sayname: function () {Alert (this.name) ؛ }} ؛في الكود أعلاه ، لم تعد سمة المنشئ تشير إلى الشخص ، ولا يمكن تحديد نوع الكائن من خلال المنشئ. يمكنك إعادتها إلى القيمة المناسبة كما أدناه
وظيفة person () {} person.prototype = {constructor: الشخص ، الاسم: "Nicholas" ، العمر: 22 ، الوظيفة: "Software Engineer" ، sayname: function () {Alert (this.name) ؛ }} ؛سيؤدي إعادة تعيين خاصية المنشئ إلى زيادة ضبط خاصية [[التعداد]] على صواب. بشكل افتراضي ، فإن خاصية المنشئ الأصلي غير قابلة للاسترداد. يمكنك استخدام Object.DefineProperty () لتغييره.
Object.DefineProperty (person.prototype ، "Constructor" ، {enumerable: false ، value: person}) ؛عملية العثور على القيم في نموذج أولي هي بحث ، ويمكن أن تنعكس أي تعديلات من قبل كائن النموذج الأولي على الفور من المثيل.
var friend = شخص جديد ()
يتم إنشاء مثيل الشخص قبل إضافة طريقة جديدة ، ولكن لا يزال لديه إمكانية الوصول إلى الطريقة المضافة حديثًا بسبب العلاقة الفضفاضة بين المثيل والنموذج الأولي
الوضع بعد إعادة كتابة كائن النموذج الأولي
وظيفة person () {} var friend = new person () ؛ person.prototype = {name: "nicholas" ، العمر: 22 ، الوظيفة: "Engineer" ، sayname: function () {Alert (this.name) ؛ }} ؛ Friend.SayName () ؛ // خطأسبب الخطأ عند استدعاء Friend.SayName () هو أن النموذج الأولي الذي أشار إليه صديق لا يحتوي على سمات سميت بعد هذا الحقل ، كما هو موضح في الشكل أدناه.
مشكلة كائن النموذج الأولي
يحذف كائن النموذج الأولي عملية تمرير معلمات التهيئة للمشارك ، وتحصل جميع القوى على نفس قيمة السمة بشكل افتراضي. أكبر مشكلة في نماذج النموذج الأولي هي أن لديهم طبيعتها المشتركة. عندما يحتوي نموذج النموذج الأولي على سمات النوع المرجعي ، تكون المشكلة أكثر خطورة. دعونا نلقي نظرة على المثال التالي.
وظيفة person () {} person.prototype = {مُنشئ: شخص ، الاسم: "نيكولاس" ، العمر: 22 ، الوظيفة: "مهندس البرمجيات" ، الأصدقاء: ["شيلبي" ، "المحكمة"] ، sayname: function () {Alert (this.name) ؛ }} ؛ var person1 = new person () ؛ var person2 = شخص جديد () ؛ person1.friend.push ("van") ؛ ALERT (person1.friends) ؛ // "Shelby ، Court ، Van" Alert (person25. الجمع بين وضع المنشئ ووضع النموذج الأولي
في تركيبة من وضع المنشئ ووضع النموذج الأولي ، يتم استخدام المنشآت لتحديد خصائص المثيل ، ويتم استخدام نماذج النموذج الأولي لتحديد الأساليب والخصائص المشتركة. وبهذه الطريقة ، سيكون لكل مثيل نسخته الخاصة من سمات المثيل ، ويمكنه أيضًا مشاركة المراجع إلى الأساليب ، وتوفير الذاكرة إلى الحد الأقصى.
وظيفة الشخص (الاسم ، العمر ، الوظيفة) {this.name = name ؛ this.age = العمر ؛ this.job = Job ؛ this.friends = ["Shelby" ، "Court"] ؛} person.prototype = {constructor: person ، sayname: function () {Alert (this.name) ؛ }} var person1 = شخص جديد ("نيكولاس" ، 22 ، "مهندس البرمجيات") ؛ var person2 = شخص جديد ("Greg" ، 24 ، "student") ؛ person1.friend.push ("van") ؛ ALERT (person1.friends) ؛ // "Shelby ، Court ، Van" ALERT (Person26. وضع النموذج الأولي الديناميكي
يلف الوضع الديناميكي النموذجية جميع المعلومات المطلوبة في المُنشئ ، ويستخدم عبارة IF لتحديد خاصية معينة في النموذج الأولي. إذا لم يكن موجودًا (عندما يتم استدعاء المُنشئ لأول مرة) ، قم بتنفيذ رمز تهيئة النموذج الأولي داخل العبارة IF.
وظيفة الشخص (الاسم ، العمر) {this.name = name ؛ this.age = العمر ؛ this.job = Job ؛ // method if (typeof this.sayname! = 'function') {person.prototype.sayname = function () {Alert (this.name) ؛ } ؛ }} var friend = شخص جديد ('nicholas' ، '22' ، 'Engineer') ؛ // تم استدعاء المنشئ لأول مرة ، وتم تعديل النموذج الأولي في هذا الوقت var person2 = شخص جديد ('amy' ، '21') ؛القراءة الموصى بها:
العديد من الطرق الشائعة لإنشاء كائنات في JS الموجهة نحو كائن (وضع المصنع ، وضع المنشئ ، وضع النموذج الأولي)
ما سبق هو نمط إنشاء كائنات في JavaScript التي قدمها لك المحرر. آمل أن يكون ذلك مفيدًا للجميع!