يقدم
يلعب هذا دورًا مهمًا جدًا في برمجة الكائنات المختلفة ويستخدم بشكل أساسي للإشارة إلى كائن الاستدعاء. ومع ذلك، في JavaScript، يكون الأداء مختلفًا تمامًا، خاصة في سياقات التنفيذ المختلفة.
نعلم من المقالة السابقة أن هذه أيضًا سمة في سياق التنفيذ، لذا فمن المقدر أن تكون غير قابلة للفصل عن سياق التنفيذ.
انسخ رمز الكود كما يلي:
أكتيفيكسيكوتيونكونتيكست = {
تعليق صوتي: {...}،
هذا: هذه القيمة}؛
في جافا سكريبت، تعتمد قيمة هذا على وضع الاستدعاء. هناك أربعة أوضاع للاتصال: وضع استدعاء الأسلوب، ووضع استدعاء الوظيفة، ووضع استدعاء المُنشئ، ووضع تطبيق الاتصال.
وضع المكالمة
نمط استدعاء الأسلوب
عندما يتم حفظ دالة كخاصية لكائن ما، فإننا نسميها طريقة. عندما يتم استدعاء طريقة ما، فإن هذا يرتبط بالكائن، أي أن نمط استدعاء الأسلوب يشير إلى كائن الاستدعاء. من السهل جدًا فهم ذلك، فأنت طريقتي، وأنت تنتمي إليّ، وبالطبع هذا يشير إلي.
انسخ رمز الكود كما يلي:
فار ماي أوبجيكت = {
القيمة: 0،
الزيادة : وظيفة (الشركة) {
this.value += typeof inc === "number" ?
}
}
myObject.increment();
console.log(myObject.value); //الإخراج: 1
myObject.increment(3);
console.log(myObject.value); //الإخراج: 4
لأنه يمكنك الوصول إلى الكائن الذي تنتمي إليه من خلال ذلك، يمكنك استدعاء وتعديل الخصائص أو الأساليب الموجودة في الكائن من خلاله. كما يتبين من المقالة السابقة، يجب إنشاء هذا، كعضو في السمات في سياق التنفيذ، عند إنشاء السياق، وكل ربط هذا بالكائن يحدث في وقت الاستدعاء، وهو ". الربط المتأخر". ويمكن تحقيق درجة عالية من إعادة استخدام هذا من خلال الربط المؤجل.
انسخ رمز الكود كما يلي:
وظيفة عرض القيمة () {
console.log(this.value);
}
var a = { value : "a"};
var b = { value : "b"};
a.showValue = showValue;
b.showValue = showValue;
a.showValue(); //الإخراج "أ"
b.showValue(); //الإخراج "ب"
تنتمي الدالة showValue في المثال أعلاه إلى الارتباط المؤجل.
نمط استدعاء الوظيفة
عندما لا يتم استدعاء دالة كطريقة لكائن ما، فهي استدعاء دالة. في وضع استدعاء الدالة، يرتبط هذا بالكائن العام. (هذا خطأ في تصميم اللغة)
انسخ رمز الكود كما يلي:
myObject.double = function(){
فار ذلك = هذا;
فار مساعد = وظيفة () {
console.log(that, ": ", that.value); // كائن الإخراج {القيمة: 4، الزيادة: الوظيفة، مزدوج: الوظيفة} ": " 4
console.log(this, ": ", this.value); // نافذة الإخراج {top: Window, window: Window...} ": " غير محدد
}
helper(); // الاتصال كوظيفة
}
وفقًا للتفكير العادي، كما هو الحال في الإخراج في السطر الرابع، يجب أن يشير هذا إلى الكائن الذي تنتمي إليه الوظيفة، ومع ذلك، نظرًا لوجود مشاكل في تصميم اللغة، فإن هذا يشير إلى الكائن العام. وهذا يجعل الأمر أكثر غموضًا ولا يمكن التنبؤ به. لكن كمطورين، لا نريد أن نرى هذا الموقف بالتأكيد. ولحسن الحظ، فإن العلاج بسيط جدًا أيضًا في المثال أعلاه. بهذه الطريقة، يمكن استخدام استدعاء ذلك في الأسلوب المساعد بهذه الطريقة، وهو أمر بسيط ومريح. أما بالنسبة لوضع استدعاء الوظيفة، فسيتم شرح سبب تصرفه على هذا النحو بالتفصيل لاحقًا عند تحليل النوع المرجعي.
نمط استدعاء المنشئ
نظرًا لأن JavaScript تعتمد على الميراث النموذجي، فإن مصمميها يريدون أن تكون قادرة على إنشاء كائنات من خلال أدوات إنشاء جديدة مثل اللغات التقليدية الموجهة للكائنات، لتحقيق البرمجة الموجهة للكائنات. لا يبدو أن هذه فكرة جيدة، ومن المحرج بعض الشيء رسم نمر بدلاً من كلب. الأول هو أنه من المستحيل أن نتعلم، ولكن ليست هناك حاجة للتعلم. تعد آلية الميراث النموذجية لجافا سكريبت قوية جدًا بالفعل، وهي كافية لتلبية تعدد أشكال الميراث المطلوب للكائنات الموجهة.
دون مزيد من اللغط، دعونا نتحدث عن نمط استدعاء المنشئ. نمط استدعاء المنشئ بسيط جدًا، وهو استخدام دالة كمنشئ، ثم استخدامها لتقديم الخصائص والأساليب التي تنوي نشرها للعامة. على النحو التالي
انسخ رمز الكود كما يلي:
وظيفة الشخص (الاسم والعمر) {
this.name = name;
this.age = age;
this.say = function(){
console.log("الاسم : %s, العمر : %n", this.name, this.age);
}
}
var p1 = new Person("jink", 24);
p1.say(); // اسم الإخراج: جينك، العمر: 24
var p2 = new Person("Zhang San", 33);
p2.say();// اسم الإخراج: تشانغ سان، العمر: 33
من المثال أعلاه، يمكننا أن نرى بوضوح أن هذا يشير إلى الكائن الذي تم إنشاؤه من خلال الجديد والمنشئ. لماذا يحدث هذا؟ وذلك لأنه عندما يتم استدعاء المنشئ من خلال جديد في JavaScript، يستدعي المشغل الجديد طريقة [[Construct]] الداخلية لوظيفة "الشخص"، وبعد إنشاء الكائن، تكون طريقة [[Call]] الداخلية هي مُسَمًّى. تقوم نفس وظيفة "الشخص" بتعيين قيمة هذا للكائن الذي تم إنشاؤه حديثًا.
تطبيق وضع الاتصال
بعد إنشاء جميع الوظائف في JavaScript، سيكون لها طريقتان: التطبيق والاستدعاء. لا أريد أن أشرح الاستخدام المحدد لهاتين الطريقتين بالتفصيل هنا، حيث يمكن للطلاب الذين لا يعرفون البحث في بايدو. من خلال طريقتين، يمكننا ضبط ذلك يدويًا. على الرغم من أنه لا يُسمح بتعديل ذلك أثناء الإنشاء، إلا أنه إذا قمنا بضبطه يدويًا قبل الإنشاء، فهذا أمر آخر. هذا الإعداد مذهل، يمكنك جعل كائنك يستدعي بأي طريقة، تمامًا كما يمكنك جعل سيارة تبحر في البحر، وفيل أفريقي يسرع مثل جاكوار، ومبرمج يعزف مثل عازف البيانو. هاها، الخيال جميل دائمًا، الاتصال هو اتصال، ولكن ما إذا كان يمكن تحقيق الوظيفة بعد الاتصال، فهذا أمر آخر.
انسخ رمز الكود كما يلي:
مبرمج فار = {
الاسم: "مبرمج"،
يد: "أيدي مرنة"،
البرنامج: وظيفة () {
console.log(this.name+"اكتب الكود باستخدام "+this.hand+".");
}
}
فار عازف البيانو = {
الاسم: "عازف البيانو"،
يد: "أيدي مرنة"،
اللعب: وظيفة () {
console.log(this.name+"تشغيل موسيقى جميلة باستخدام "+this.hand+".");
}
}
فار لاعب = {
الاسم: "رياضي"،
القدم: "أرجل قوية"،
تشغيل : وظيفة () {
console.log(this.name+"استخدم "+this.foot+" للتشغيل في الملعب.");
}
}
// اتبع القواعد
Programmer.programme(); // يكتب المبرمجون التعليمات البرمجية بأيدٍ مرنة.
pianist.play(); // يستخدم عازف البيانو يديه المرنة لعزف موسيقى جميلة.
player.run(); // يركض الرياضيون في الملعب بأرجل قوية.
//غريب الأطوار
pianist.play.apply(programmer); // يستخدم المبرمجون أيديهم المرنة لتشغيل الموسيقى الجميلة.
player.run.apply(programmer); // يستخدم المبرمجون غير محدد للتشغيل في الميدان. بسبب قلة ممارسة الرياضة البدنية، ليس لدي أرجل قوية
يبدو من المثير للاهتمام أن نرى أعلاه المعلمة الأولى للتطبيق هي هذا المؤشر في طريقة التنفيذ. بهذه الطريقة، يمكننا استعارة أساليب الآخرين واستخدامها سرًا بأنفسنا، وهو أمر مريح للغاية. غالبًا ما يستخدم هذا النوع من التقنية في بعض الأطر.
تلخيص
هذا كل ما يجب أن أقوله عن هذا، وأعتقد أنه بعد قراءة هذا، سيكون لدى الجميع بعض الفهم لتحديد هذا في المواقف المختلفة. لقد خططت في الأصل لمناقشة الكائن المرجعي بعد ذلك وشرح قيمة هذا في وضع استدعاء الأسلوب ومبدأ وضع استدعاء الوظيفة، لكنني كنت أخشى أن يكون الطول طويلاً جدًا، لذلك قررت استخدام فصل منفصل لتحليل مفهوم الكائنات المرجعية.