ما هو الموجهة نحو الكائن؟ الموجهة نحو الكائن هو نوع من التفكير! (هراء).
يمكن للموجهة نحو الكائن التعامل مع جميع الوحدات الرئيسية في البرنامج ككائنات ، والوحدات النمطية لها سمات وطرق. وبهذه الطريقة ، إذا قمنا بتغليف بعض الخصائص والأساليب ، فسيكون ذلك مناسبًا جدًا لاستخدامه في المستقبل ويمكننا أيضًا تجنب العمل الشاق والمتكرر. بعد ذلك ، سنشرح التنفيذ الموجهة للكائن في JS.
نموذج المصنع
نمط المصنع هو نمط تصميم معروف في مجال هندسة البرمجيات ، وبما أنه لا يمكن إنشاء الفئات في ECMASCRIPT ، يتم إنشاء الكائنات مع تغليف الوظائف. طريقة التنفيذ بسيطة للغاية ، أي إنشاء كائن في الوظيفة ، وتعيين السمات والأساليب للكائن ثم إرجاع الكائن.
الدالة CreateBlog (name ، url) {var o = new Object () ؛ O.Name = name ؛ O.URL = url ؛ O.Sayurl = function () {Alert (this.url) ؛ } return o ؛} var blog1 = createBlog ('wuyuchang' ، '//www.vevb.com/') ؛يمكن ملاحظة أن طريقة تنفيذ نمط المصنع بسيطة للغاية ، حيث تحل مشكلة إنشاء كائنات مماثلة متعددة ، ولكن لا يمكن أن يحدد نمط المصنع نوع الكائن لأنه كل كائن ، على عكس التاريخ ، الصفيف ، وما إلى ذلك ، لذلك يظهر نمط المنشئ.
وضع المنشئ
يمكن أن يقوم المنشئ في ECMASCRIPT بإنشاء كائنات من أنواع محددة ، على غرار كائنات JS الأصلية مثل الصفيف والتاريخ. طريقة التنفيذ هي كما يلي:
دالة المدونة (الاسم ، url) {this.name = name ؛ this.url = url ؛ this.alerturl = function () {Alert (this.url) ؛ }} var blog = new blog ('wuyuchang' ، '//www.vevb.com/') ؛console.log(blog easureof blog) ؛ // صحيح ، حدد ما إذا كانت المدونة مثيل للمدونة ، أي أنها تحل المشكلة التي لا يمكن أن يكون وضع المصنعهذا المثال يختلف عن نموذج المصنع باستثناء اسم الوظيفة ، يجب أن تجد أحذية الأطفال الدقيقة العديد من الاختلافات:
يتم رسملة الحرف الأول من اسم الوظيفة (على الرغم من أن المعيار لا ينص بدقة على أن الحرف الأول يتم رسملة ، وفقًا للاتفاقية ، يتم رسملة الحرف الأول من المنشئ.
إنشاء كائن غير معروض
تعيين السمات والأساليب مباشرة لهذا الكائن
لا بيان العودة
إنشاء كائن باستخدام جديد
تكون قادرًا على التعرف على الكائنات (هذا هو المكان الذي تفوق فيه أنماط المصنع الأنماط)
على الرغم من سهلة الاستخدام ، إلا أنها لا تخلو من عيوب. أكبر مشكلة في استخدام المنشئين هي أنه يتعين عليهم إعادة إنشاء الطريقة في كل مرة يقومون فيها بإنشاء مثيل (نظريًا ، تختلف خصائص الكائن في كل مرة يقومون فيها بإنشاء كائن ، وطرق الكائن هي نفسها). ومع ذلك ، ليس من الضروري إنشاء نفس الطريقة بالضبط مرتين ، حتى نتمكن من تحريك الوظيفة خارج الكائن (ربما شهدت أحذية بعض الأطفال العيوب ، shhhh!).
دالة المدونة (الاسم ، url) {this.name = name ؛ this.url = url ؛ this.alerturl = alerturl ؛} دالة ALERTURL () {Alert (this.url) ؛} var blog = new blog ('scjb51' ، 'http://sc.vevb.com/') ، blog2 = new blog ('jb51' ، '//www.vevb.com/') ؛ // http://sc.vevb.com/blog2.alerturl () ؛ // //www.vevb.com/قمنا بتعيين ALERTURL على وظيفة عالمية ، بحيث تصل المدونة والمدونة إلى نفس الوظيفة ، ولكن المشكلة تأتي مرة أخرى. يتم تعريف الوظيفة التي تريد استخدام المدونة فقط في النطاق العالمي ، مما يدل على أن النطاق العالمي يستحق اسمه إلى حد ما. ما هو غير مقبول أكثر هو أن العديد من الطرق محددة في النطاق العالمي التي تستخدمها فقط كائنات محددة. لا يقتصر الأمر على المساحة المهدرة ، بل من الواضح أنها تفقد التغليف الموجهة للكائنات ، لذلك يمكن حل هذه المشكلة من خلال النماذج الأولية.
وضع النموذج الأولي
كل وظيفة نقوم بإنشائها لها سمة نموذجية ، وهي مؤشر لكائن ، والغرض من هذا الكائن هو احتواء خصائص وطرق يمكن مشاركتها بواسطة جميع الحالات من نوع معين. ميزة استخدام كائنات النموذج الأولي هي أن جميع مثيلات الكائن يمكن أن تشارك الخصائص والأساليب التي تحتوي عليها.
وظيفة المدونة () {} blog.prototype.name = 'wuyuchang' ؛ blog.prototype.url = 'http://tools.vevb.com/' ؛blog.prototype.friend = [' fr1 '،' fr2 '،' fr3 '،' fl4 '] ؛ this.friend) ؛} // التالي هو رمز الاختبار var blog = new blog () ، blog2 = new blog () ؛ blog.alertinfo () ؛ // wuyuchanghttp: //tools.vevb.com/fr1،fr2،fr3،fr4blog2.alertinfo () ؛ // wuyuchanghttp: //tools.vevb.com/fr1،fr2،fr3،fr4blog.name = 'wyc1' ؛ blog.url = 'http: //*** ’ // wyc1http: //***.comfr1،fr2،fr3blog2.alertinfo () ؛ // wyc2http: //++.comfr1،fr2،fr3نمط النموذج الأولي لا يخلو من أوجه القصور. بادئ ذي بدء ، فإنه يحذف رابط المعلمات التهيئة المُنشئة. نتيجة لذلك ، تحصل جميع الحالات على نفس قيمة السمة بشكل افتراضي ، وهي غير مريحة للغاية ، ولكن هذه ليست أكبر مشكلة للنموذج الأولي. أكبر مشكلة في نمط النموذج الأولي ناتج عن طبيعة المشاركة. بسبب المشاركة ، يقوم أحد الأمثلة بتعديل المرجع ، والآخر يغير أيضًا المرجع. لذلك ، عادة لا نستخدم النماذج الأولية بمفردها ، ولكننا نجمع بين أنماط النموذج الأولي مع أنماط المنشئ.
الوضع المختلط (وضع النموذج الأولي + وضع المنشئ)
دالة المدونة (الاسم ، url ، صديق) {this.name = name ؛ this.url = url ؛ this.friend = friend ؛} blog.prototype.alertinfo = function () {Alert (this.name + this.url + this.friend) ؛} var blog = new blog ('wuyuchang' ، 'http://tools.vevb.com/' 'http: //**.com' ، ['a' ، 'b']) ؛ blog.friend.pop () ؛ blog.alertinfo () ؛ // wuyuchanghttp: //tools.vevb.com/fr1،fr2blog2.alertinfo () ؛ // wychttp: //**.coma،bفي الوضع المختلط ، يتم استخدام وضع المنشئ لتحديد سمات المثيل ، بينما يتم استخدام وضع النموذج الأولي لتحديد الطرق والسمات المشتركة. سيكون لكل مثيل سمة مثيل خاصة به ، ولكن في نفس الوقت تشارك الأساليب ، مما يوفر الذاكرة إلى أقصى حد. بالإضافة إلى ذلك ، يدعم هذا الوضع أيضًا تمرير المعلمات الأولية. العديد من المزايا. هذا النمط هو الطريقة الأكثر استخدامًا والأكثر شهرة لإنشاء كائنات مخصصة في ECMASCRIPT.
وضع النموذج الأولي الديناميكي
يلف وضع النموذج الأولي الديناميكي جميع المعلومات في المُنشئ ، ومن خلال تهيئة النموذج الأولي في المُنشئ (تتم تهيئة النموذج الأولي فقط عند إنشاء الكائن الأول) ، يتيح لك ذلك اختيار ما إذا كان يجب تهيئة النموذج الأولي عن طريق الحكم على ما إذا كانت الطريقة صالحة.
دالة المدونة (الاسم ، url) {this.name = name ؛ this.url = url ؛ if (typeof this.alertinfo! = 'function') {// يتم تنفيذ هذا الرمز فقط مرة واحدة في حالة تأهب ('exe time') ؛ blog.prototype.alertinfo = function () {Alert (thia.name + this.url) ؛ }}} var blog = new blog ('wuyuchang' ، 'http://tools.vevb.com') ، blog2 = new blog ('wyc' ، 'http: ***. com') ؛يمكنك أن ترى أنه في المثال أعلاه ، تنبثق النافذة مرة واحدة ، "Exe Time" ، أي عند تهيئة المدونة ، لا يحتاج Blog2 إلى تهيئة النموذج الأولي. لإنشاء كائنات باستخدام هذا النمط ، يمكن اعتباره مثاليًا.
يشير منشور المدونة هذا إلى الإصدار الثالث من "JavaScript Advanced Programming" ، ولكن تم تبسيط اللغة وإعادة كتابة الأمثلة. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة ورد ، وسيقوم المؤلف بتحديث المدونة.