استخدام `this` في الكائن معرَّف باختصار عبر الأقواس
تُرجِع الدالة makeUser كائنًا هنا. ما النتيجة من الدخول إلى ref الخاص بها؟ ولماذا؟
What is the result of accessing its ref? Why?
function makeUser() {
return {
name: "John",
ref: this
};
}
let user = makeUser();
alert( user.ref.name ); // ما النتيجة؟
Aالإجابة: ظهور خطأ.
جربها:
function makeUser() {
return {
name: "John",
ref: this
};
}
let user = makeUser();
alert( user.ref.name ); // ِلِقيمة غير معرفة 'name' خطأ: لا يمكن قراءة الخاصية
ذلك لأن القواعد التي تعين this لا تنظر إلى تعريف الكائن. ما يهم هو وقت الاستدعاء. قيمة this هنا بداخل makeUser() هي undefined، لأنها استُدعيَت كدالة منفصلة، وليس كدالة بصياغة النقطة.
قيمة this هي واحدة للدالة ككل، ولا تؤثر عليها أجزاء الشيفرة ولا حتى الكائنات. لذا فإن ref: this تأخذ this الحالي للدالة
function makeUser(){
return this; // this time there's no object literal
}
alert( makeUser().name ); // Error: Cannot read property 'name' of undefined
كما ترى فإن نتيجة alert( makeUser().name ) هي نفسها نتيجة alert( user.ref.name ) من المثال السابق
هنا حالة معاكسة تمامًا:
function makeUser() {
return {
name: "John",
ref() {
return this;
}
};
}
let user = makeUser();
alert( user.ref().name ); // John
أصبحت تعمل هنا لأن user.ref() هي دالة، وقيمة this تعَيَّن للكائن الذي قبل النقطة '.'