العديد من أوضاع إنشاء الكائنات شائعة الاستخدام
قم بإنشاء كلمة رئيسية جديدة
الطريقة الأساسية لإنشاء الكائنات ليست أكثر مما تقوله معظم اللغات: إذا لم يكن لديك كائنات ، فيمكنك الحصول على جديد!
var gf = new Object () ؛ gf.name = "tangwei" ؛ gf.bar = "c ++" ؛ gf.saywhat = function () {console.log (this.name+"sad: love you forever") ؛}خلق مع الحرفية
يبدو أن هذا صحيح ، ولكن كيف يمكن للمهوسون مثل هذه الطريقة المعقدة والمنخفضة المستوى لتحديد المتغيرات؟ كلغة نصية ، يجب أن يكون لها نفس نمط الإخوة الآخرين ، وبالتالي فإن طريقة تعريف الحرفيات الكائنات تظهر:
var gf = {name: "tangwei" ، bar: "c ++" ، قل ماذا: function () {console.log (this.name+"sad: love you forever") ؛ }}نموذج المصنع
في الواقع ، هذه هي طريقة تعريف الكائن الأكثر استخدامًا في الواقع ، ولكن ماذا يجب أن أفعل إذا كان لدي العديد من الكائنات ذات سمات مماثلة (من المثير التفكير في الأمر ...)؟ إذا تم إجراء تعريف واحد واحدًا تلو الآخر ، فسيتم إنشاء كمية كبيرة من التعليمات البرمجية. لماذا لا تبني مصنعًا وينتج بشكل كبير أشياءنا؟ لذلك ، أول طفل قابل للنفخ في عالم JavaScript. . . لا ، ولد "نموذج المصنع"!
الدالة creategf (الاسم ، شريط) {var o = new Object () ؛ O.Name = name ؛ O.Bar = bar ؛ O.Saywhat = function () {Alert (this.name + "Sad: Love You Forever") ؛ } return o ؛} var gf1 = creategf ("bingbing" ، "d") ؛ var gf2 = creategf ("mimi" ، "a") ؛مُنشئ
يحل نمط المصنع مشكلة إنشاء كائنات مماثلة متعددة ، لكن المشكلة تأتي مرة أخرى. يتم تشكيل كل هذه الكائنات بواسطة الكائنات. كيفية التمييز بين الأنواع المحددة من كائناتها؟ في هذا الوقت ، نحتاج إلى التبديل إلى وضع آخر ، وضع المنشئ:
وظيفة gf (الاسم ، شريط) {this.name = name ؛ this.bar = bar ؛ this.saywhat = function () {Alert (this.name + "قال: أحبك إلى الأبد") ؛ }} var gf1 = new gf ("vivian" ، "f") ؛ var gf2 = new gf ("vivian2" ، "f") ؛هنا نستخدم مُنشئًا يبدأ بأحرف رأس المال لاستبدال CreateGF في المثال أعلاه. لاحظ أنه يجب رسملة الحرف الأول من المنشئ وفقًا للاتفاقية. هنا نقوم بإنشاء كائن جديد ، ثم نخصص نطاق المُنشئ إلى الكائن الجديد ، واتصل بالطرق في المنشئ.
يبدو أنه لا يوجد شيء خاطئ في الطريقة المذكورة أعلاه ، ولكن يمكننا أن نجد أن طريقة Saywhat في المُنشئ المسمى في الحالتين ليست هي نفس حالة الوظيفة:
console.log (gf1.saywhat == gf2.saywhat) ؛ //خطأ شنيع
إن استدعاء نفس الطريقة ولكن إعلان الحالات المختلفة هو مضيعة للموارد. يمكننا تحسين بيان وظيفة Saywhat خارج المُنشئ:
وظيفة gf (الاسم ، شريط) {this.name = name ؛ this.bar = bar ؛ هذا.هذا يحل مشكلة تحديد مثيل الطريقة نفسها عدة مرات ، ولكن مشكلة جديدة تأتي مرة أخرى. إن القول ما حددناه هو طريقة نطاق عالمي ، ولكن لا يمكن تسمية هذه الطريقة مباشرة ، وهي متناقضة بعض الشيء. كيف تحدد كائن أكثر أناقة مع تغليف معين؟ دعونا نلقي نظرة على نمط كائن النموذج الأولي JavaScript.
نمط كائن النموذج الأولي
فهم كائنات النموذج الأولي
عندما نقوم بإنشاء وظيفة ، سيكون للوظيفة سمة النموذج الأولي ، والتي تشير إلى كائن النموذج الأولي للدالة التي تم إنشاؤها من خلال المنشئ. من حيث Layman ، فإن كائنات النموذج الأولي هي كائنات في الذاكرة توفر خصائص وطرق مشتركة للكائنات الأخرى.
في وضع النموذج الأولي ، ليست هناك حاجة لتحديد سمات المثيل في المنشئ ، ويمكن تعيين معلومات السمة مباشرة إلى كائن النموذج الأولي:
دالة gf () {gf.prototype.name = "Vivian" ؛ gf.prototype.bar = "c ++" ؛ gf.prototype.saywhat = function () {Alert (this.name + "Sad: Love You Forever") ؛ }} var gf1 = new gf () ؛ gf1.saywhat () ؛ var gf2 = new gf () ؛الفرق من المُنشئ هو أن خصائص وطرق الكائن الجديد يمكن مشاركتها بواسطة جميع الحالات. بمعنى آخر ، تصل GF1 و GF2 إلى نفس الخصائص والأساليب. بالإضافة إلى السمات التي قمنا بتعيينها ، هناك أيضًا بعض السمات المدمجة في كائن النموذج الأولي. تحتوي جميع كائنات النموذج الأولي على سمة مُنشئ ، وهي مؤشر إلى وظيفة تحتوي على سمة النموذج الأولي (سواء كنت تجرؤ على التجول مرة أخرى!). من خلال صورة ، دعنا نفرز عملية التواء هذا بوضوح:
جميع الكائنات لها كائن النموذج الأولي (النموذج الأولي). هناك سمة مُنشأة في كائن النموذج الأولي تشير إلى وظيفة تحتوي على سمة النموذج الأولي. تحتوي مثيلات GF's GF1 و GF2 على سمة داخلية تشير إلى كائن النموذج الأولي (يظهر Proto كسمة خاصة في متصفح Firefox). عندما نصل إلى السمة في كائن ما ، سنسأل أولاً ما إذا كان كائن المثيل يحتوي على هذه السمة. إذا لم يكن الأمر كذلك ، فسوف نستمر في البحث عن كائن النموذج الأولي.
باستخدام كائنات النموذج الأولي
في المثال السابق ، لاحظنا أنه عند إضافة خصائص إلى كائن النموذج الأولي ، نحتاج إلى إضافة نمط GF.Protype إلى كل منهما. هذا العمل متكرر للغاية. في نمط إنشاء الكائن أعلاه ، نعلم أنه يمكن إنشاء كائن في شكل حرفي. هنا يمكننا أيضًا تحسينه:
الدالة gf () {} gf.prototype = {name: "vivian" ، bar: "c ++" ، قل ماذا: function () {Alert (this.name+"sad: love you forever") ؛ }}هناك مكان نحتاج فيه إلى إيلاء اهتمام خاص. لم تعد سمة المنشأة تشير إلى الكائن GF ، لأنه في كل مرة يتم تحديد وظيفة ، سيتم إنشاء كائن النموذج الأولي له في نفس الوقت ، وسيحصل هذا الكائن تلقائيًا على سمة مُنشأة جديدة. في هذا المكان ، نستخدم النمط gf.protype للكتابة بشكل أساسي على كائن النموذج الأولي الأصلي ، لذلك أصبح المنشئ أيضًا سمة مُنشئ للكائن الجديد ، ولم يعد يشير إلى GF ، ولكن الكائن:
var gf1 = new gf () ؛ console.log (gf1.constructor == gf) ؛ // falseconsole.log (gf1.constructor == object) // true
بشكل عام ، لن يؤثر هذا التغيير الدقيق لنا ، ولكن إذا كان لديك احتياجات خاصة للمشارك ، فيمكننا أيضًا تحديد خاصية مُنشئ GF.Prototype:
gf.prototype = {constructor: gf ، name: "Vivian" ، bar: "c ++" ، قل ماذا: function () {Alert (this.name+"said: love you forever") ؛ }} var gf1 = new gf () ؛ console.log (gf1.constructor == gf) ؛ // trueمن خلال الفهم الأولي لنمط كائن النموذج الأولي ، وجدنا أن جميع كائنات المثيل تشترك في نفس السمات ، وهي الميزة الأساسية لنمط النموذج الأولي ، ولكن غالبًا ما يكون هذا "سيفًا مزدوجًا" للمطورين. في التطور الفعلي ، يجب أن يكون للحالات التي نأمل أن يكون لها سماتها الخاصة ، وهذا هو السبب الرئيسي أيضًا في أن قلة من الناس يستخدمون نمط النموذج الأولي وحده في التطور الفعلي.
نمط تركيبة مُنشئ ونموذج أولي
في التطوير الفعلي ، يمكننا استخدام المُنشئين لتحديد خصائص الكائنات واستخدام النماذج الأولية لتحديد الخصائص والأساليب المشتركة ، حتى نتمكن من تمرير معلمات مختلفة لإنشاء كائنات مختلفة ، مع وجود طرق وخصائص مشتركة.
وظيفة gf (الاسم ، شريط) {this.name = name ؛ this.bar = bar ؛} gf.prototype = {constructor: gf ، قل ماذا: function () {Alert (this.name + "sad: love you forever") ؛ }} var gf1 = new gf ("vivian" ، "f") ؛ var gf2 = new gf ("vivian1" ، "c") ؛في هذا المثال ، نحدد قيم الخصائص ذات الصلة للكائنات في وظيفة المنشئ ، ونحدد سمة المنشئ ونقول الوظيفة في كائن النموذج الأولي ، بحيث لن يكون هناك أي تأثير بين سمات GF1 و GF2. هذا النمط هو أيضًا طريقة تعريف الكائن الأكثر استخدامًا في التطوير الفعلي ، بما في ذلك الوضع الافتراضي الذي اعتمدته العديد من مكتبات JS (Bootstrap ، إلخ).