في javascritp ، هذا ليس بالضرورة السياق الوحيد لطريقة الكائن ، ويشار إلى ذلك أيضًا في مكالمات الوظائف العالمية والعديد من السياقات المختلفة الأخرى.
يمكن أن يكون كائنًا عالميًا أو كائنًا حاليًا أو أي كائن ، اعتمادًا على كيفية استدعاء الوظيفة. هناك عدة طرق للاتصال بالوظائف في JavaScript: كمكالمات طريقة الكائن ، كمكالمات وظائف ، كمكالمات مُنشئ ، واستخدام مكالمات التطبيق أو المكالمات.
1. استدعاء كوسيلة كائن
في JavaScript ، هي أيضًا كائنات ، لذلك يمكن استخدام الوظائف كسمات للكائن في هذا الوقت.
نسخة الكود كما يلي:
var point = {
X: 0 ،
Y: 0 ،
Moveto: Function (x ، y) {
this.x = this.x + x ؛
this.y = this.y + y ؛
}
} ؛
point.moveto (1 ، 1) // هذا يرتبط بالكائن الحالي ، أي كائن نقطة
2. كمكالمة وظيفة
يمكن أيضًا استدعاء الوظيفة مباشرةً ، وهذا مرتبط بالكائن العالمي. في المتصفح ، النافذة هي الكائن العالمي. على سبيل المثال ، المثال التالي: عندما يتم استدعاء وظيفة ، فإن هذا مرتبط بالكائن العالمي ، ويتم تنفيذ بيان المهمة بعد ذلك ، وهو ما يعادل إعلان متغير عالمي ضمنيًا ، وهو ما لا يريده المتصل.
نسخة الكود كما يلي:
وظيفة makenosense (x) {
this.x = x ؛
}
Makenosense (5) ؛
أصبح x ؛ // x متغيرًا عالميًا بقيمة 5
بالنسبة للوظائف الداخلية ، أي أن الوظائف المعلنة ضمن جسم وظيفة أخرى ، فإن طريقة الربط بكائن عالمي ستخلق مشكلة أخرى. سنستخدم كائن النقطة المذكور سابقًا كمثال. قد تكون النتيجة غير متوقعة.
نسخة الكود كما يلي:
var point = {
X: 0 ،
Y: 0 ،
Moveto: Function (x ، y) {
// وظائف داخلية
var movex = function (x) {
this.x = x ؛ // أين هذا ملزم؟
} ؛
// وظائف داخلية
var movey = function (y) {
this.y = y ؛ // أين هذا ملزم؟
} ؛
movex (x) ؛
Movey (y) ؛
}
} ؛
point.moveto (1 ، 1) ؛
point.x ؛
point.y ؛
x ؛
y ؛
هذا عيب في تصميم JavaScript.
نسخة الكود كما يلي:
var point = {
X: 0 ،
Y: 0 ،
Moveto: Function (x ، y) {
var that = هذا ؛
// وظائف داخلية
var movex = function (x) {
that.x = x ؛
} ؛
// وظائف داخلية
var movey = function (y) {
that.y = y ؛
}
movex (x) ؛
Movey (y) ؛
}
} ؛
point.moveto (1 ، 1) ؛
point.x ؛
point.y ؛
ودعا كمؤسسة
يدعم JavaScript البرمجة الموجهة للكائنات. في المقابل ، فإن المُنشئين في JavaScript مميزون جدًا. كقاعدة تقليدية أخرى ، يبدأ المنشئ بحرف رأس المال لتذكير المتصل بالاتصال بالطريقة الصحيحة. إذا كانت المكالمة صحيحة ، فهذا مرتبط بالكائن الذي تم إنشاؤه حديثًا.
نسخة الكود كما يلي:
نقطة الوظيفة (x ، y) {
this.x = x ؛
this.y = y ؛
}
اتصل باستخدام التطبيق أو الاتصال
دعنا نكرر أنه في وظائف JavaScript هي أيضًا كائنات ، والكائنات لها طرق ، وتطبيق ومكالمة هي طرق كائنات الوظيفة. هاتان الطريقتان قويتان للغاية ، ويسمحان بتبديل سياق تنفيذ الوظيفة ، أي الكائن المرتبط بهذا. يتم استخدام هذه الطريقة في العديد من تقنيات JavaScript ومكتبات الفصل. دعونا نلقي نظرة على مثال محدد:
نسخة الكود كما يلي:
نقطة الوظيفة (x ، y) {
this.x = x ؛
this.y = y ؛
this.moveto = function (x ، y) {
this.x = x ؛
this.y = y ؛
}
}
var p1 = نقطة جديدة (0 ، 0) ؛
var p2 = {x: 0 ، y: 0} ؛
p1.moveto (1 ، 1) ؛
p1.moveto.apply (p2 ، [10 ، 10]) ؛
في المثال أعلاه ، نستخدم المُنشئ لإنشاء كائن P1 ، والذي يحتوي أيضًا على طريقة Moveto ؛ كما أن دعوة طريقة أخرى لها نفس الوظيفة ، والفرق هو أن المعلمة الأخيرة لا يتم تمريرها بالزيادة كصفيف ، ولكن يتم تمريرها بشكل منفصل.
نسخة الكود كما يلي:
وظيفة foo () {
//1. هذا المنشئ المشار إليه هو كائن مشار إليه بواسطة PINCUMINE.CALEE
// الإرشادات مُنشئين من خلال المشغل الجديد
if (this.constructor == ediuments.callee) {
تنبيه ("كائن تم إنشاؤه") ؛
}
//2. هذه نافذة ، ثم مكالمة عالمية
إذا (هذا == نافذة) {
تنبيه ("المكالمة العادية") ؛
}
آخر {// 3.
تنبيه ("دعا"+ this.constructor) ؛
}
}
FOO () ؛ // استدعاء الوظيفة العالمية
foo.call (كائن جديد ()) ؛ // استدعاء كطريقة عضو لكائن كائن
جديد FOO () ؛ // اتصل من قبل المشغل الجديد لتنفيذ بناء الكائنات