عندما نتحدث عن الكائن الموجود نحو الكائن ، يمكننا التفكير في الفصل ، والكائنات ، والتعبئة ، والميراث ، وتعدد الأشكال. في كتاب "JavaScript Advanced Program Design" (People Post and Telecommonications Press ، Cao Li ، Zhang Xin. الاسم الإنجليزي هو: JavaScript الاحترافي لمطوري الويب) في الكتاب. دعنا نلقي نظرة على الطرق المختلفة المحددة في JavaScript.
1. طريقة المصنع
قم بإنشاء فئة وأشياء خاصة بنا في JavaScript ، يجب علينا أن نتعلم جميعًا.
نسخ رمز رمز على النحو التالي:
<script type = "text/javaScript">
//تعريف
var ocar = new Object () ؛
Ocar.Color = "Red" ؛
Ocar.Doors = 4 ؛
ocar.showcolor = function () {
تنبيه (this.color) ؛
}
// يتصل
Ocar.ShowColor () ؛
</script>
نحن سهلون في استخدام كائنات OCAR ، لكننا نقوم بإنشاء مثيلات متعددة للسيارات. يمكننا استخدام وظيفة لتغليف الكود أعلاه للتنفيذ:
نسخ رمز رمز على النحو التالي:
<script type = "text/javaScript">
//تعريف
وظيفة CreateCar () {
var ocar = new Object () ؛
Ocar.Color = "Red" ؛
Ocar.Doors = 4 ؛
ocar.showcolor = function () {
تنبيه (this.color) ؛
}
إرجاع OCAR.
}
// يتصل
var ocar1 = createCar () ؛
var ocar2 = createCar () ؛
OCAR1.COLOR = "Black" ؛
OCAR1.SHOWCOLOR () ؛
OCAR2.SHOWCOLOR () ؛
</script>
بالمناسبة ، فإن سمات العضوية الافتراضية لكائن JavaScript هي عامة. وبهذه الطريقة ، نسميها طريقة مصنع ، وقمنا بإنشاء مصانع يمكنها إنشاء أنواع محددة من الكائنات وإرجاعها.
هذا أمر مثير للاهتمام بعض الشيء ، ولكن في الكائن الموجهة للكائن ، فإن طريقة إنشاء الكائن هي:
سيارة السيارة = سيارة جديدة () ؛
كان استخدام الكلمات الرئيسية الجديدة متجذرة في قلوب الناس ، لذلك نستخدم الطريقة أعلاه لتحديدها. . دعونا نلقي نظرة على تعريف شكل المنشئ.
2. مُنشئ
هذه الطريقة تبدو وكأنها وظيفة المصنع. الأداء المحدد هو كما يلي:
نسخ رمز رمز على النحو التالي:
<script type = "text/javaScript">
//تعريف
وظيفة السيارة (اللون ، الأبواب) {
this.color = اللون ؛
this.doors = الأبواب ؛
this.showcolor = function () {
تنبيه (this.color) ؛
} ؛
}
// يتصل
var car1 = سيارة جديدة ("أحمر" ، 4) ؛
var car2 = سيارة جديدة ("Blue" ، 4) ؛
car1.showcolor () ؛
car2.showcolor () ؛
</script>
يبدو واضحا ، هناك اختلافات. إنه شعور مثير للاهتمام بعض الشيء. قم بإنشاء كائن داخل وظيفة البناء باستخدام هذه الكلمات الرئيسية ، ويشعر بأنه لطيف للغاية لإنشاء كائنات باستخدام رمز الحوسبة الجديد. ولكن هناك أيضًا بعض المشكلات: في كل مرة يتم فيها إنشاء الكائن الجديد ، فإن جميع السمات ، بما في ذلك إنشاء الوظيفة ، بمعنى أن الكائنات المتعددة مستقلة تمامًا. كائن CAR1 و CAR2 كلاهما. هذه هي ميزة الشكل الأصلي.
3. النموذج الأولي
باستخدام سمة النموذج الأولي للكائن ، يمكنك رؤية النموذج الأولي الذي يعتمد عليه الكائن الجديد. الطريقة كما يلي:
نسخ رمز رمز على النحو التالي:
<script type = "text/javaScript">
//تعريف
سيارة فو () {
} ؛
car.prototype.color = "red" ؛
car.prototype.doors = 4 ؛
car.prototype.drivers = صفيف جديد ("توم" ، "جيري") ؛
car.prototype.showcolor = function () {
تنبيه (this.color) ؛
}
// يتصل:
var car1 = سيارة جديدة () ؛
var car2 = New Car () ؛
car1.showcolor () ؛
car2.showcolor () ؛
ALERT (CAR1.DRIVERS) ؛
car1.drivers.push ("Stephen") ؛
تنبيه (car1.drivers) ؛
تنبيه (car2.drivers) ؛
// يمكنك استخدام JSON لتبسيط تعريف النموذج الأولي:
car.prototype =
{{
اللون: "أحمر" ،
الأبواب: 4 ،
السائقون: ["توم" ، "جيري" ، "سافاد"] ،
Showcolor: function () {
تنبيه (this.color) ؛
}
}
</script>
بادئ ذي بدء ، مُنشئ هذا الرمز ، لا يوجد رمز ، ثم إضافة سمة الكائن لتحديد سمة كائن السيارة من خلال سمة النموذج الأولي للكائن. هذه الطريقة جيدة جدًا ، لكن المشكلة تشير إلى مؤشر الصفيف. CAR2 أيضا في نفس الوقت ، هذا غير مسموح.
في الوقت نفسه ، تتجلى المشكلة أيضًا في النموذج الأولي الذي لا يمكنه إحضار أي معلمات تهيئة ، مما يجعل المُنشئ لا يمكن تهيئة بشكل طبيعي. هذا يتطلب طريقة أخرى لحل: وهذا هو وضع المنشئ/النموذج الأولي.
4. وضع المنشئ/النموذج الأولي المختلط
مزيج من المنشئ والنموذج الأولي مناسب للغاية لتحديد الفصل.
نسخ رمز رمز على النحو التالي:
<script type = "text/javaScript">
//تعريف
وظيفة السيارة (اللون ، الأبواب)
{{
this.color = اللون ؛
this.doors = الأبواب ؛
this.drivers = صفيف جديد ("توم" ، "جيري") ؛
}
car.prototype.showcolor = function () {
تنبيه (this.color) ؛
}
// يتصل:
var car1 = سيارة جديدة ('Red' ، 4) ؛
var car2 = سيارة جديدة ('Blue' ، 4) ؛
car1.showcolor () ؛
car2.showcolor () ؛
ALERT (CAR1.DRIVERS) ؛
car1.drivers.push ("Stephen") ؛
تنبيه (car1.drivers) ؛
تنبيه (car2.drivers) ؛
تنبيه (CAR1 مثيل السيارة) ؛
</script>
هذه الطريقة هي تحديد السمات في الداخل ، واستخدام النموذج الأولي لتعريفه في الخارج. مشكلة حل الطريقة الثالثة.
يجب أن تكون هذه الطريقة ودودة للغاية ، ولكن بالمقارنة مع قواعد جافا ، يجب أن يكون هناك بعض التنافر ، ونادراً ما ينطوي على فوضوي. بالنسبة لموظفي J2EE R&D ، فإن هذه الطريقة محرجة دائمًا. تشعر دائمًا بأنها ليست عبوة ودية ، يعتبر أنه أكثر إثارة للقلق. هذا هو النموذج الأولي الديناميكي.
5. النموذج الأولي الديناميكي
بالنسبة للمطورين الذين اعتادوا على استخدام لغات أخرى ، فإن استخدام المنشئ/النماذج الأولية ليس متناغمًا. بعد كل شيء ، عند تحديد الفئات ، يتم تعبئة معظم اللغات الموجهة نحو الكائنات بصريًا على السمات والأساليب. النظر في فئة C#التالية:
نسخ رمز رمز على النحو التالي:
الفصل الدراسي // فئة
{{
سلسلة السلسلة العامة = "الأحمر" ؛
الأبواب العامة = 4 ؛
الباحث العام = 23 ؛
السيارة العامة (لون السلسلة ، الأبواب الداخلية ، INT MPG) // مُنشئ
{{
this.color = اللون ؛
this.doors = الأبواب ؛
this.mpg = mpg ؛
}
شاشية باطلة عامة () // medhod
{{
console.writeline (this.color) ؛
}
}
C#مليئة بكل سمات وطرق فئة السيارة ، لذلك عندما ترى هذا الرمز ، فأنت تعرف الوظائف التي يجب تحقيقها ، وتحدد معلومات الكائن. يعتقد الأشخاص الذين ينتقدون مُنشئ/النموذج الأولي للمصممون المختلطون أن طريقة إيجاد سمات في ذاكرة المنشئ ، وطريقة العثور على طرق خارجها ليست منطقية. لذلك ، قاموا بتصميم نموذج أولي ديناميكي لتوفير أسلوب ترميز أكثر ودية.
إن الفكرة الأساسية لطريقة النموذج الأولي الديناميكي هي نفس المُنشئ/النموذج الأولي للبنية المختلطة ، أي تحديد سمات غير وظيفية في المنشئ ، ويتم تعريف سمة الوظيفة باستخدام سمة النموذج الأولي. الفرق الوحيد هو موضع طريقة الكائن. فيما يلي فئة السيارة التي أعيد كتابتها بواسطة النموذج الأولي الديناميكي:
نسخ رمز رمز على النحو التالي:
<script type = "text/javaScript">
//تعريف
سيارة فو () {
this.color = "red" ؛
this.doors = 4 ؛
this.drivers = صفيف جديد ("توم" ، "جيري") ؛
ifof car._initialized == "غير محدد") {{
car.prototype.showcolor = function () {
تنبيه (this.color) ؛
}
// ............
}
// التعريف الأخير
car._initialized = true ؛
}
</script>
حتى التحقق من typeof car._initialized المكافئ مساويا لـ "غير محدد" ، لم يتغير هذا المُنشئ. هذا السطر من الكود هو الجزء الأكثر أهمية في طريقة النموذج الأولي الديناميكي. إذا لم يتم تعريف هذه القيمة ، فسيستمر المُنشئ في تحديد طريقة الكائن حسب النموذج الأولي ، ثم تعيين car._initialized إلى True. إذا تم تعريف هذه القيمة (عندما تكون قيمتها صحيحة ، تكون قيمة typeof منطقية) ، فلن يتم إنشاء هذه الطريقة. باختصار ، تستخدم هذه الطريقة الشعار (_initialized) لتحديد ما إذا كان قد أعطى أي طريقة للنموذج الأولي. يتم إنشاء هذه الطريقة وتعيينها مرة واحدة فقط.
6 طريقة المصنع الهجينة
عادةً ما تكون هذه الطريقة طريقة لتغيير الطريقة التي لا يمكن تطبيق بها الطريقة السابقة. الغرض منه هو إنشاء مُنشئ مزيف وإرجاع مثال جديد فقط لكائن آخر. يبدو أن هذا الرمز يشبه إلى حد كبير وظيفة المصنع:
نسخ رمز رمز على النحو التالي:
سيارة فو () {
var ompcar = new Object () ؛
ionmpcar.color = "red" ؛
ionmpcar.doors = 4 ؛
ionmpcar.mpg = 23 ؛
ionmpcar.showcolor = function () {
تنبيه (this.color) ؛
}
إرجاع otempcar ؛
}
تختلف عن الطريقة الكلاسيكية ، تستخدم هذه الطريقة المشغل الجديد لجعله يبدو وكأنه وظيفة بنية حقيقية:
var ocar = سيارة جديدة () ؛
نظرًا لأن المشغل الجديد يسمى داخل مُنشئ السيارة () ، سيتم تجاهل المشغل الجديد الثاني (يقع خارج المنشئ). يتم تمرير الكائن الذي تم إنشاؤه في المنشئ إلى المتغير VAR. هذه الطريقة لديها نفس المشكلات مثل الطرق الكلاسيكية لطريقة الكائن. موصى به بشدة: ما لم يكن عليك (انظر الفصل 15) ، فلا يزالون تتجنب هذه الطريقة.
ملخص: (أي طريقة تستخدم)
في الوقت الحاضر ، الأكثر استخدامًا هو مُنشئ/نموذج أولي مختلط. بالإضافة إلى ذلك ، تحظى النماذج الأولية الديناميكية أيضًا بشعبية كبيرة ، وهي مكافئة للوظيفة الوظيفية/النموذج الأولي في الوظيفة. يمكنك استخدام أي من هاتين الطريقتين. ومع ذلك ، لا تستخدم المنشئ الكلاسيكي أو النموذج الأولي ، لأن هذا سيعرض الكود للمشكلة.
نسخ رمز رمز على النحو التالي:
// PS
// فئة ثابتة (1: وظيفة)
varcollection = new function () {
var _carcollection = صفيف جديد () ؛
this.add = function (objcar) {
تنبيه ("إضافة") ؛
}
this.get = function (carid) {
تنبيه ('get') ؛
}
}
// فئة ثابتة (2: JSON)
var car = {
اللون: "أحمر" ،
الأبواب: 4 ،
showcolor: function () {Alert (this.color) ؛}
}
car.showcolor () ؛