في لغة نموذجية موجهة نحو الكائن ، مثل Java ، هناك مفهوم الفصل. الفئة هي قالب كائن وكائن هو مثيل للفئة. ومع ذلك ، في نظام لغة JavaScript ، لا يوجد مفهوم للطبقة. لا يعتمد JavaScript على "الفصل" ، ولكن يتم تنفيذه من خلال المُنشئين وسلاسل النموذج الأولي. ومع ذلك ، يوفر ES6 طريقة كتابة أقرب إلى اللغات التقليدية ، حيث تقدم مفهوم الفئة (الفصل) كقالب كائن. من خلال الكلمة الرئيسية للفصل ، يمكنك تحديد فئة. في الأساس ، يمكن اعتبار فئة ES6 مجرد سكر بناء الجملة. يمكن تحقيق معظم وظائفها بواسطة ES5. تجعل طريقة كتابة الفصل الجديدة فقط كائن النموذج الأولي مكتوبة أكثر وضوحًا وأكثر مثل بناء جملة البرمجة الموجهة للكائنات.
وفقًا لعادتي ، سأقدم دليل المقالة قبل كتابته.
سيتم تقسيم المحتوى التالي إلى الأقسام الفرعية التالية:
1. مقدمة موجزة للمصمم
2. سلبيات المنشئين
3. دور سمة النموذج الأولي
4. سلسلة النموذج الأولي
5. سمة البناء
5.1: دور سمة المنشئ
6. مثيل المشغل
1. مقدمة موجزة للمصمم
في مقالتي حول العلاقة الوثيقة بين المُنشئين والأوامر الجديدة في JavaScript ، يتم تقديم مفهوم وخصائص المنشئين ، ومبادئ واستخدام الأوامر الجديدة ، وما إلى ذلك ، بالتفصيل. إذا لم تكن معتادًا على المُنشئين ، فيمكنك الذهاب وتذوقهم بعناية. هنا مراجعة بسيطة.
ما يسمى المُنشئ هو وظيفة توفر قالبًا لإنشاء كائن ويصف الهيكل الأساسي للكائن. يمكن للمُنشئ إنشاء كائنات متعددة ، ولكل منها نفس الهيكل. بشكل عام ، يعد المُنشئ نموذجًا لكائن ، وكائن هو مثيل لمؤسس.
خصائص المنشئ هي:
ج: يجب أن يتم رسملة الحرف الأول من اسم وظيفة المنشئ.
ب: استخدم هذا الكائن داخليًا للإشارة إلى مثيل الكائن ليتم إنشاؤه.
C: استخدم المشغل الجديد للاتصال بالمشارك وإرجاع مثيل الكائن.
دعونا نرى أبسط مثال.
وظيفة person () {this.name = 'keith' ؛} var boy = new person () ؛ console.log (boy.name) ؛ // "كيث"2. سلبيات المنشئين
يمكن لجميع كائنات المثيل أن ترث الخصائص والأساليب في المنشئ. ومع ذلك ، لا يمكن مشاركة الخصائص بين نفس مثيلات الكائن.
وظيفة الشخص (الاسم ، الارتفاع) {this.name = name ؛ this.height = الارتفاع ؛ this.hobby = function () {return 'Watch Films' ؛}} var boy = new شخص ('Keith' ، 180) ؛ var girl = شخص جديد ('Rascal' ، 153) ؛ console.log (boy.name) ؛ // "Keith" console.log (girl.name) ؛ // 'rascal' console.log (boy.hobby === girl.hobby) ؛ //خطأ شنيعفي الكود أعلاه ، يقوم شخص مُنشئ بإنشاء حالتين وفتاة كائن ، ولديه خصائص وطريقة. ومع ذلك ، فإن طريقة هوايةهم مختلفة. وهذا يعني ، كلما استخدمت New لاتصال المُنشئ لوضعه على مثيل كائن ، سيتم إنشاء طريقة هواية. هذا ليس ضروريًا ولا مضيعة للموارد ، لأن جميع أساليب الهوايات هي سلوكيات طفولية ويمكن مشاركتها تمامًا بواسطة حالتين كائنات.
لذلك ، فإن عيب المنشئين هو أنه لا يمكن مشاركة الخصائص أو الأساليب بين مثيلات الكائنات لنفس المنشئ.
3. دور سمة النموذج الأولي
لحل عيب عدم القدرة على مشاركة الخصائص بين مثيلات الكائنات من البنائين ، يوفر JS سمات النموذج الأولي.
كل نوع من البيانات في JS هو كائن (باستثناء NULL وغير محدد) ، ويرث كل كائن من كائن آخر ، ويسمى الأخير كائن "النموذج الأولي" ، باستثناء NULL ، والذي لا يحتوي على كائن النموذج الأولي الخاص به.
سيتم مشاركة جميع الخصائص والأساليب على كائن النموذج الأولي بواسطة مثيل الكائن.
عندما يتم إنشاء مثيل كائن من خلال مُنشئ ، يتم توجيه النموذج الأولي لمثيل الكائن إلى خاصية النموذج الأولي للمقدم. يحتوي كل مُنشئ على سمة نموذج أولي ، وهو كائن النموذج الأولي لمثيل الكائن.
وظيفة الشخص (الاسم ، الارتفاع) {this.name = name ؛ this.height = الارتفاع ؛ } person.prototype.hobby = function () {return 'Watch Films' ؛ } var boy = شخص جديد ('keith' ، 180) ؛ var girl = شخص جديد ('Rascal' ، 153) ؛ console.log (boy.name) ؛ // "Keith" console.log (girl.name) ؛ // 'rascal' console.log (boy.hobby === girl.hobby) ؛ //حقيقيفي الكود أعلاه ، إذا تم وضع طريقة Hobby على كائن النموذج الأولي ، فإن كلا كلا كائلي المثيل يشتركان في نفس الطريقة. آمل أن يتمكن الجميع من فهم أنه بالنسبة للمشاركين ، فإن النموذج الأولي هو خاصية كمؤسس ؛ بالنسبة لمثيلات الكائن ، فإن النموذج الأولي هو كائن النموذج الأولي من مثيلات الكائن. لذلك ، النموذج الأولي هو خاصية وكائن.
الكائنات النموذجية ليست خصائص لحالات الكائن. سمات مثيل الكائن هي سمات موروثة من تعريف المنشئ ، لأن هناك كلمة رئيسية داخل المنشئ للإشارة إلى مثيل الكائن المراد إنشاؤه. خصائص مثيل الكائن هي في الواقع سمات محددة داخليًا بواسطة المنشئ. طالما يتم تعديل الخصائص والأساليب على كائن النموذج الأولي ، ستنعكس التغييرات على الفور في جميع مثيلات الكائنات.
person.prototype.hobby = function () {return 'swimming' ؛ } console.log (boy.hobby === girl.hobby) ؛ // true console.log (boy.hobby ()) ؛ // 'Swimming'console.log (girl.hobby ()) ؛ //'سباحة'في الكود أعلاه ، بعد تعديل طريقة هواية كائن النموذج الأولي ، تغيرت كلتا حالتين الكائنات. وذلك لأن مثيلات الكائنات لا تحتوي في الواقع على طرق هواية ، فهي كلها أساليب هواية تقرأ كائنات النموذج الأولي. وهذا يعني أنه عندما لا يحتوي مثيل الكائن على الخاصية والطريقة ، فسيبحث عن كائن النموذج الأولي. إذا كان كائن المثيل نفسه يحتوي على خاصية أو طريقة معينة ، فلن يتم البحث في كائن النموذج الأولي.
boy.hobby = function () {return 'play basketball' ؛ } console.log (boy.hobby ()) ؛ // 'play basketball' console.log (girl.hobby ()) ؛ //'سباحة'في الكود أعلاه ، عندما يتم تعديل طريقة Hobby لمثيل كائن Boy ، فلن يتم مورث طريقة الهواية على كائن النموذج الأولي. ومع ذلك ، ستظل الفتاة ترث طريقة كائن النموذج الأولي.
لتلخيص:
ج: تتمثل وظيفة كائن النموذج الأولي في تحديد الخصائص والأساليب المشتركة بين جميع مثيلات الكائن.
ب: النموذج الأولي ، للمشاركين ، إنه خاصية ؛ بالنسبة لحالات الكائن ، فهو كائن النموذج الأولي.
4. سلاسل النموذج الأولي
يمكن تعريف خصائص وطرق الكائن في حد ذاته أو في كائن النموذج الأولي. نظرًا لأن كائن النموذج الأولي نفسه هو كائن لمثيلات الكائنات وله أيضًا النموذج الأولي الخاص به ، يتم تشكيل سلسلة النموذج الأولي. على سبيل المثال ، الكائن A هو النموذج الأولي للكائن B ، والكائن B هو النموذج الأولي للكائن C ، وهلم جرا. الجزء العلوي من النموذج الأولي لجميع الكائنات هو الكائن.
بطبيعة الحال ، فإن كائن النمط. النموذج أيضًا له كائن النموذج الأولي الخاص به ، أي كائن فارغ بدون أي سمات وطرق ، ولا يحتوي الكائن الفارغ على النموذج الأولي الخاص به.
1 console.log (Object.getProtypeOf (Object.prototype)) ؛ //باطل
2 console.log (person.prototype.isprototypeof (boy)) // true
خصائص سلاسل النموذج الأولي هي:
ج: عند قراءة خاصية معينة لكائن ما ، يبحث محرك JavaScript أولاً عن خاصية الكائن نفسه. إذا لم يكن من الممكن العثور عليها ، فسوف يذهب إلى النموذج الأولي. إذا كان لا يزال لا يمكن العثور عليه ، فسيذهب إلى النموذج الأولي للنموذج الأولي. إذا لم يتم العثور على الكائن.
ب: إذا كان الكائن نفسه ونموذجه الأولي يحدد سمة تحمل نفس الاسم ، فسيتم قراءة سمات الكائن نفسها أولاً ، والتي تسمى "تجاوز".
C: البحث عن سمة معينة في مستوى سلسلة النموذج الأولي للأعلى له تأثير على الأداء. كلما ارتفع مستوى كائن النموذج الأولي الذي تبحث عنه ، زاد التأثير على الأداء. إذا كنت تبحث عن خاصية غير موجودة ، فسوف يعبر سلسلة النموذج الأولي بأكمله.
قد يكون من الغامض النظر إلى المفهوم ، دعنا نأخذ مثالاً. لكن من المهم حقًا فهم المفهوم.
var arr = [1،2،3] ؛ console.log (arr.length) ؛ //3console.log (arr.valueof ()) // [1،2،3] console.log (arr.join ('|')) // 1 | 2 | 3في الكود أعلاه ، يتم تعريف ARR ARR ، مع ثلاثة عناصر في الصفيف. لم نضيف أي سمات أو طرق إلى الصفيف ، لكننا لم نقوم بالإبلاغ عن خطأ عند استدعاء طول ، انضمام () ، و ValueOF ().
ويرث سمة الطول من Array.Prototype وينتمي إلى خاصية على كائن النموذج الأولي. ورثت طريقة الانضمام أيضًا من Array.Prototype وينتمي إلى طريقة على كائن النموذج الأولي. تتم مشاركة هاتين الطريقتين بواسطة جميع المصفوفات. عندما لا يكون هناك سمة طول على كائن المثيل ، سيتم البحث في كائن النموذج الأولي.
ورثت طريقة القيمة من الكائن. بادئ ذي بدء ، لا تحتوي صفيف ARR على طريقة قيمة ، لذا ابحث عن صفيف كائن النموذج الأولي. ثم ، وجدت أنه لا توجد طريقة قيمة على كائن النمط. أخيرًا ، ابحث عن كائن النمط.
دعنا نلقي نظرة على خصائص وطرق كائن الصفيف. النموذج وكائن كائن.
console.log (object.getownpropertynames (Array.prototype)) // ["الطول" ، "tosource" ، "toString" ، "tolocalestring" ، "Join" ، "خريطة" ، "مرشح" ، "اختصار" ، "بعض" ، "كل" ، "العثور" ، "findIndex" ، "copwithin" ، "file" ، "intries" ، "keys" ، "keys" ، "keys" ، "configer.prot.prot) ،" $ set "، $ remove". "ToString" ، "tolocalestring" ، "valueof" ، "watch" ، "unfate" ، "hasownproperty" ، "isprototypeof" ،
أعتقد أنه عندما ترى هذا ، لا يزال لديك فهم بسيط للغاية للنموذج الأولي. هذا طبيعي. بعد كل شيء ، إنه مفهوم أكثر أهمية وتجريدًا في JS. من المستحيل إتقانه بهذه السرعة. إذا أكلت بعض المقالات ، يمكنك إتقان الجوهر. بطريقة معينة ، هناك مثال حي ، قد يكون أيضًا مشكلة يواجهها الجميع. يمكنك إلقاء نظرة على مُنشئ JS وكائنات النموذج الأولي.
5. سمة البناء
يحتوي كائن النموذج الأولي على سمة مُنشأة تشير إلى وظيفة المنشئ حيث يوجد كائن النموذج الأولي افتراضيًا.
الدالة A () {} ؛ console.log (A.Prototype.constructor === a) // trueتجدر الإشارة إلى أن النموذج الأولي هو خاصية المُنشئ ، والمُنشئ هو الكائن الذي تشر إليه خاصية النموذج الأولي للمركب ، أي خاصية كائن النموذج الأولي. احرص على عدم الخلط.
console.log (A.HasownProperty ('النموذج الأولي')) ؛ // true console.log (A.Protype.hasownproperty ('Constructor')) ؛ //حقيقينظرًا لأن سمة المنشئ محددة على كائن النموذج الأولي ، فهذا يعني أنه يمكن موروثه بواسطة جميع كائنات المثيل.
الدالة A () {} ؛ var a = new a () ؛ console.log (A.Constructor) ؛ //a()console.log(a.constructor===A.Prototype.Constructor) ؛//trueفي الكود أعلاه ، A هو كائن مثيل من مُنشئ A ، ولكن لا يحتوي على سمة مُنشئ ، والتي تقرأ بالفعل سلسلة النموذج الأولي.
A.Prototype.Constructor Property.
5.1: دور سمة المنشئ
ج: تحديد وظيفة المنشئ هي كائن النموذج الأولي الذي ينتمي إليه
الدالة A () {} ؛ var a = new a () ؛ console.log (a.constructor === a) // true console.log (A.Constructor === Array) // falseيعني الرمز أعلاه أن استخدام خاصية المنشئ ، يتم تحديد أن وظيفة مُنشئ كائن المثيل A A ، وليس صفيفًا.
ب: إنشاء مثيل آخر من المثيل
الدالة A () {} ؛ var a = new a () ؛ var b = new A.Constructor () ؛ console.log (b extryof a) ؛ //حقيقيفي الكود أعلاه ، A هو كائن مثيل من مُنشئ A ، ويمكن استدعاء المنشئ بشكل غير مباشر من A.Constructor.
ج: من الممكن استدعاء مُنشئه الخاص
A.Prototype.hello = function () {return new this.constructor () ؛ }D: يوفر نمطًا من ورث مُنشئ آخر من مُنشئ
وظيفة الأب () {} وظيفة SON () {son.height.constructor.call (this) ؛ } son.Height = New Boving () ؛في الكود أعلاه ، الأب والابن كلاهما مُنشئان. إن استدعاء الأب على هذا الابن داخل الابن سوف يشكل تأثير الابن الذي يرث الأب.
E: نظرًا لأن سمة المنشئ هي علاقة بين كائن النموذج الأولي والمُنشئ ، عند تعديل كائن النموذج الأولي ، يجب أن تنتبه إلى مشكلة توجيه المُنشئ.
هناك حلانان: كلتا النقطة سمة المُنشأة إلى وظيفة المنشئ الأصلية ، أو مجرد إضافة خصائص وطرق إلى كائن النموذج الأولي لتجنب تشويه مثيل.
6. مثيل المشغل
يقوم مشغل مثيل EST بإرجاع قيمة منطقية تشير إلى ما إذا كان الكائن المحدد هو مثيل لمؤسس.
الدالة A () {} ؛ var a = new a () ؛ console.log (A estructionof a) ؛ //حقيقينظرًا لأن مثيل OF صالح للكائنات الموجودة على سلسلة النموذج الأولي بأكمله ، فقد يعود كائن المثيل نفسه إلى منشئات متعددة.
الدالة A () {} ؛ var a = new a () ؛ console.log (A extryof a) ؛ //trueconsole.log(a مثيل من كائن) ؛ //حقيقيلاحظ أنه لا يمكن استخدام كائنات مثيل فقط لأنواع البيانات المعقدة (المصفوفات ، الكائنات ، إلخ) ولا يمكن استخدامها لأنواع البيانات البسيطة (القيم المنطقية والأرقام والسلاسل ، إلخ).
var x = [1] ؛ var o = {} ؛ var b = true ؛ var c = 'string' ؛ console.log (x مثيل Array) ؛ //trueconsole.log(O مثيل من كائن) ؛ // true console.log (b extreamof boolean) ؛ //falseconsole.log(C مثيل string) ؛ //خطأ شنيعأيضًا ، لا توجد كائنات لاغية أو غير محددة ، لذا فإن مثيله يعيد دائمًا خطأ.
console.log (null extryof object) ؛ // false console.log (Ondefined extryof Object) ؛ //خطأ شنيع
باستخدام عامل التشغيل ، يمكنك أيضًا حل مشكلة نسيان إضافة أمر جديد عند الاتصال بالمقدم.
وظيفة keith (الاسم ، الارتفاع) {if (! هذا مثيل keith) {return new Keith (name ، height) ؛ } this.name = name ؛ this.hight = الارتفاع ؛}في الكود أعلاه ، يتم استخدام مشغل مثيل OF لتحديد ما إذا كانت الكلمة الرئيسية في جسم الوظيفة تشير إلى مثيل للمشارك Keith. إذا لم يكن كذلك ، فهذا يعني أن الأمر الجديد قد نسي. في هذا الوقت ، سيعيد المنشئ مثيل كائن لتجنب نتائج غير متوقعة.
بسبب قيود المساحة ، سأقدمها هنا في الوقت الحالي.
في حصتي التالية ، سأتحدث عن بعض الأساليب الأصلية للكائنات النموذجية ، مثل Object.getPrototypeoF () ، و Object.setProtypeOF () ، وما إلى ذلك ، وتقديم مقارنة بين طرق الحصول على الكائنات الأصلية.
ما سبق هو التفسير التفصيلي لسمة النموذج الأولي (الموصى به) في JavaScript الذي قدمه لك المحرر. آمل أن يكون ذلك مفيدًا لك.