الاستخدام 1 (الاستخدام الشائع):
التعبير هو: object.method.call(another object)، وهو ما يعني استبدال الكائن الحالي بكائن آخر وتنفيذ طريقة الكائن الحالي. لننظر إلى المثال أولاً:
انسخ رمز الكود كما يلي:
وظيفة فئة 1 () {
this.name = "class1";
this.showName = function(){
تنبيه(هذا.اسم);
}
}
وظيفة كلاس 2 () {
this.name = "class2";
}
var c1 = new Class1();
var c2 = new Class2();
c1.showName.call(c2);
c2.showName(); // لا يمكن تنفيذه
قمنا أولاً بتعريف وظيفتين على التوالي، وهما Class1 وClass2. والفرق الرئيسي بينهما هو أن Class2 لديه طريقة showName() واحدة أكثر من Class1. ثم يتم تعريف الكائنات c1 وc2 المتوافقة مع Class1 وClass2. في هذا الوقت، نعلم بوضوح أن c1 لديه طريقة showName() ولكن c2 لا يمتلكها. ولكن حدثت معجزة عندما نقوم بتنفيذ c1.shoName.call(c2)، ستظهر القيمة الاسمية لـ c2، وهي "class2". في الواقع، ما زلنا ننفذ أساليب c1، لكننا استبدلنا الكائن c2 مؤقتًا بالكائن c1. بعد التنفيذ، لا تزال كما هي عندما تم تعريفها، ولم يعد لدى c2 أي طرق أخرى. من أجل اكتشاف ما إذا كان c2 يحتوي على المزيد من الأساليب، يضيف المثال السطر c2.showNmae(); لا يمكن تنفيذه، وسيقوم المتصفح بالإبلاغ عن الخطأ Object #<Class2> لا يحتوي على طريقة 'showName'.
لماذا تفعل هذا؟ كما ذكرنا من قبل، هذه طريقة استخدام مؤقتة، نستخدمها فقط للبرمجة الفعالة. لكن هذا لا يخلو من القيود. لنفترض أن c1 وc2 يُستخدمان لتمثيل الكائن المستبدل والكائن البديل، ويتم استخدام fun1 لتمثيل الطريقة المتأصلة لـ c1. 1. عندما لا تتطلب fun1 معلمات ولا تستخدم أي متغيرات محلية في الوظيفة الأصلية، فلا يوجد فرق في الواقع بين c1.fun1.call(c2) وc1.fun1(); 2. عندما لا تتطلب fun1 معلمات ولكن يستخدم متغيرات الوظيفة الأصلية، ثم يلزم إنشاء المتغيرات المستخدمة بواسطة fun1 بنفس الأسماء في وظائف c1 وc2. عندما يتطلب fun1 معلمات، يجب إعادة كتابة النموذج كـ c1.fun1.call(c2 المعلمة 1، المعلمة 2، ... المعلمة n)، في هذا الوقت، لا يجب أن يكون اسم المتغير في الوظيفة التي تولد c1 هو نفس اسم اسم المتغير في الوظيفة التي تولد c2، بل يحتاج فقط إلى التوافق. في الواقع، عندما نستخدم الاتصال، غالبًا ما يكون لـ c2 وc1 أوجه تشابه كبيرة في البنية والوظيفة، لذلك من السهل تجنب النقاط الثلاث المذكورة أعلاه.
الاستخدام الثاني:
يتم استخدامه أثناء عملية تعريف الوظيفة، على شكل: function.call(this) موجودة أخرى، والتي يمكنها استنساخ جميع المتغيرات والأساليب الخاصة بوظيفة أخرى موجودة في دالة خاصة بها، مما يحقق وظيفة مشابهة للوراثة. دعونا نلقي نظرة على مثال:
انسخ رمز الكود كما يلي:
وظيفة الحيوان (الاسم) {
this.name = name;
this.showName = function(){
تنبيه(هذا.اسم);
}
};
var Animal = new Animal("small_animal");
Animal.showName(); //alert("small_animal")
وظيفة القط (الاسم) {
Animal.call(this, name);
};
//var Animal = null; // قم بإلغاء التعليق وجربه
var cat = new Cat("black_cat");
cat.showName(); //alert("black_cat")