ÙØ°Ù اÙÙ ÙØ§ÙØ© تÙÙÙ Ø¨ØªØºØ·ÙØ© Ù ÙØ¶Ùع Ù ØªÙØ¯Ù , ÙÙÙ٠بعض Ø§ÙØØ§ÙØ§Øª بشÙÙ Ø£ÙØ¶Ù.
Ø¥ÙÙØ§ ÙÙØ³Øª Ù ÙÙ Ø©. ÙØ¹ÙØ´ Ø§ÙØ¹Ø¯Ùد ٠٠اÙÙ Ø·ÙØ±Ù٠ذÙÙ Ø§ÙØ®Ø¨Ø±Ø© بشÙÙ Ø¬ÙØ¯ دÙÙ Ù Ø¹Ø±ÙØ© ذÙÙ. تابع اÙÙØ±Ø§Ø¡Ø© إذا ÙÙØª ØªØ±ÙØ¯ Ù Ø¹Ø±ÙØ© ÙÙÙÙØ© Ø¹Ù Ù Ø§ÙØ£Ø´Ùاء Ø®Ù٠اÙÙÙØ§ÙÙØ³.
ÙØ¯ تÙÙØ¯ استدعاء تابع تÙ
تÙÙÙÙ
٠بشÙ٠دÙÙØ§Ù
ÙÙÙ this.
عÙ٠سبÙ٠اÙ٠ثاÙ:
let user = {
name: "John",
hi() { alert(this.name); },
bye() { alert("Bye"); }
};
user.hi(); // تعÙ
Ù
// Ø§ÙØ¢Ù دعÙÙØ§ ÙÙÙÙ
بتشغÙÙ user.hi Ø£Ù user.bye Ø¨ÙØ§Ø¡Ù عÙÙ Ø§ÙØ¥Ø³Ù
(user.name == "John" ? user.hi : user.bye)(); // Error!
عÙÙ Ø§ÙØ³Ø·Ø± Ø§ÙØ£Ø®Ùر ÙÙØ¬Ø¯ عاÙ
Ù Ø´Ø±Ø·Ù ÙØ®ØªØ§Ø± Ø¥Ù
ا user.hi Ø£Ù user.bye. ÙÙ ÙØ°Ù Ø§ÙØØ§ÙØ© تÙÙ٠اÙÙØªÙجة user.hi.
Ø«Ù
ÙØªÙ
استدعاء Ø§ÙØªØ§Ø¨Ø¹ عÙ٠اÙÙÙØ± بÙÙ ÙÙØ³ÙÙ (). Ù ÙÙÙÙ ÙÙ
ÙØ¹Ù
٠بشÙ٠صØÙØ!
ÙÙ
ا ترÙ, تشغÙÙ Ø§ÙØªØ§Ø¨Ø¹ Ø£ØØ¯Ø« خطأ, بسبب Ø£Ù ÙØªÙجة "this" داخ٠تشغÙÙ Ø§ÙØªØ§Ø¨Ø¹ Ø£ÙØªØ¬ undefined.
ÙØ°Ø§ ÙØ¹Ù Ù (ÙØ§Ø¦Ù ÙÙØ·Ø© تابع):
user.hi();
ÙØ°Ø§ ÙØ§ ÙØ¹Ù Ù:
(user.name == 'John' ? user.hi : user.bye)(); // خطأ!
ÙÙ
اذ Ø Ø¥Ø°Ø§ ÙÙØ§ ÙØ±Ùد ا٠ÙÙÙÙ
ÙÙ
اذا ÙØØ¯Ø« ÙØ°Ø§, دعÙÙØ§ ÙØ±Ù Ø®Ù٠اÙÙÙØ§ÙÙØ³ ÙÙÙ ÙØ¹Ù
Ù ()obj.method.
ØªÙØ³Ùر اÙÙÙØ¹ اÙ٠رجعÙ
Ø¹ÙØ¯ Ø§ÙØªØ¯ÙÙÙ, ربÙ
ا ÙÙØ§ØØ¸ ÙØ¬Ùد عÙ
ÙÙØªÙ٠عÙ٠عبارة ()obj.method:
- اÙÙØ§Ù, اÙÙÙØ·Ø©
'.'تجب Ø§ÙØ®Ø§ØµÙØ©obj.method. - ثاÙÙØ§Ù Ø§ÙØ£ÙÙØ§Ø³
()تÙÙ٠بتشغÙÙÙØ§.
ÙØ°Ø§, ÙÙÙ ÙÙ
ÙÙ ÙÙÙ
عÙÙÙ
ات Ø§ÙØ®Ø§ØµØ© ب٠this ا٠تÙ
ر Ù
Ù Ø§ÙØ¬Ø²Ø¡ Ø§ÙØ£Ù٠اÙÙ Ø§ÙØ¬Ø²Ø¡ Ø§ÙØ«Ø§ÙÙ?
إذا ÙØ¶Ø¹Ùا ÙØ°Ù Ø§ÙØ¹Ù
ÙÙØ§Øª عÙÙ Ø®Ø·ÙØ· Ù
ÙÙØµÙØ©, اذا this سÙÙ ÙÙÙÙ
بÙÙØ¯Ùا Ø¨Ø§ÙØªØ£ÙÙØ¯:
let user = {
name: "John",
hi() { alert(this.name); }
}
// ØªÙØ³ÙÙ
Ø§ÙØØµÙ٠عÙÙ ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ Ø§ÙØªØ§Ø¨Ø¹ Ù٠سطرÙÙ
let hi = user.hi;
hi(); // خطأ, ÙØ£Ù this ØºÙØ± Ù
Ø¹Ø±ÙØ©
ÙÙØ§ hi = user.hi ÙØ¶Ø¹ Ø§ÙØªØ§Ø¨Ø¹ Ù٠اÙÙ
ØªØºÙØ±, Ø«Ù
ÙÙ Ø§ÙØ³Ø·Ø± Ø§ÙØ£Ø®Ùر ÙÙÙÙ Ù
ستÙÙØ§Ù تÙ
اÙ
اÙ, Ù ÙÙ ÙØ°Ù Ø§ÙØØ§ÙØ© ÙØ§ ÙÙØ¬Ø¯ this.
ÙØ¬Ø¹Ù ()user.hi تعÙ
Ù, Ø¬Ø§ÙØ§ Ø³ÙØ±Ùبت تستخدÙ
خدعة â Ø§ÙÙÙØ·Ø© '.' ÙØ§ ØªÙØ¹Ø¯ تابع, Ù ÙÙÙ ÙÙÙ
Ù Ù
٠اÙÙ
Ù
ÙØ² Reference Type.
اÙÙÙØ¹ اÙ٠رجع٠ÙÙ âÙÙØ¹ اÙÙ ÙØ§ØµÙاتâ. ÙØ§ ÙÙ ÙÙÙØ§ Ø§Ø³ØªØ®Ø¯Ø§Ù ÙØ§ ØµØ±Ø§ØØ©, Ù ÙÙÙ ÙØªÙ Ø§Ø³ØªØ®Ø¯Ø§Ù ÙØ§ داخÙÙØ§Ù Ø¨ÙØ§Ø³Ø·Ø© اÙÙØºÙ.
ÙÙÙ
Ø© اÙÙÙØ¹ اÙÙ
رجع٠ÙÙ Ù
Ø²ÙØ¬ Ù
Ù Ø«ÙØ§Ø« ÙÙÙ
(base, name, strict), ØÙØ«:
baseاÙÙØ§Ø¦Ù.nameØ¥Ø³Ù Ø§ÙØ®Ø§ØµÙØ©.strictتÙÙ٠صØÙØØ© اذاuse strictتع٠Ù.
اÙÙØªÙجة Ù
٠إستخداÙ
user.hi ÙØ§ ÙÙÙ٠تابع, Ù ÙÙÙ ÙÙÙ
Ø© Ù
٠اÙÙÙØ¹ اÙÙ
رجعÙ. user.hi Ù٠اÙÙØ¶Ø¹ Ø§ÙØµØ§Ø±Ù
تÙÙÙ:
// ÙÙÙ
Ø© اÙÙÙØ¹ اÙÙ
رجعÙ
user, 'hi', true;
ØÙØ« Ø§ÙØ£ÙÙØ§Ø³ () تسÙ
٠اÙÙÙØ¹ اÙÙ
رجعÙ, ÙØªÙÙÙ٠اÙÙ
عÙÙÙ
ات اÙÙØ§Ù
ÙØ© ØÙ٠اÙÙØ§Ø¦Ù Ù ØªÙØ§Ø¨Ø¹Ù, Ù ÙÙ
ÙÙ ÙØ¶Ø¹ اÙÙÙÙ
Ù Ø§ÙØµØÙØØ© ÙÙ this (=user ÙÙ ÙØ°Ù Ø§ÙØØ§ÙØ©).
اÙÙÙØ¹ اÙÙ
رجع٠ÙÙ ÙÙØ¹ داخÙ٠خاص âÙØ³ÙØ·â, بغرض تÙ
Ø±ÙØ± اÙÙ
عÙÙÙ
ات Ù
٠اÙÙÙØ·Ø© . اÙÙ Ø·ÙØ¨ Ø§ÙØ£ÙÙØ§Ø³ ().
ا٠عÙ
ÙÙØ© اخر٠Ù
ث٠hi = user.hi تتجاÙ٠اÙÙÙØ¹ اÙÙ
رجع٠باÙÙØ§Ù
Ù, تأخذ اÙÙÙÙ
Ø© Ù
Ù user.hi (Ø§ÙØªØ§Ø¨Ø¹) ٠تÙÙÙ
بتÙ
Ø±ÙØ±Ù. اذا ا٠Ù
Ù Ø§ÙØ¹Ù
ÙÙØ§Øª اÙÙ
Ø³ØªÙØ¨ÙÙØ© âØªÙÙØ¯â this.
So, as the result, the value of this is only passed the right way if the function is called directly using a dot obj.method() or square brackets obj['method']() syntax (they do the same here). There are various ways to solve this problem such as func.bind().
اÙÙ ÙØ®Øµ
اÙÙÙØ¹ اÙ٠رجع٠ÙÙ ÙÙØ¹ داخÙ٠٠٠اÙÙØºØ©.
ÙØ±Ø§Ø¡Ø© Ø®Ø§ØµÙØ© Ø ÙÙ
ا ÙÙ Ø§ÙØØ§Ù Ù
ع اÙÙÙØ·Ø© . ÙÙ obj.method() ÙØ§ ÙØ¹Ùد ÙÙÙ
Ø© Ø§ÙØ®Ø§ØµÙØ© Ø¨Ø§ÙØ¶Ø¨Ø·, Ù ÙÙÙ âØ§ÙÙÙØ¹ اÙÙ
رجعÙâ ÙÙØ§Ù Ù
Ù ÙÙÙ
Ø© Ø§ÙØ®Ø§ØµÙØ© ÙØ§ÙÙØ§Ø¦Ù Ø§ÙØ°Ù تÙ
Ø£Ø®Ø°ÙØ§ Ù
ÙÙ.
ÙØ°Ø§ ÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ Ø§ÙØ·Ø±ÙÙØ© اÙÙØ§ØÙØ© () ÙÙÙØµÙ اÙ٠اÙÙØ§Ø¦Ù Ù ÙØ¶Ø¹ ÙÙÙ
Ø© this Ø¨ÙØ§.
باÙÙØ³Ø¨Ø© ÙØ¬Ù ÙØ¹ Ø§ÙØ¹Ù ÙÙØ§Øª Ø§ÙØ£Ø®Ø±Ù Ø ÙØµØ¨Ø اÙÙÙØ¹ اÙ٠رجع٠تÙÙØ§Ø¦ÙÙØ§ ÙÙÙ Ø© Ø§ÙØ®Ø§ØµÙØ© (تابع ÙÙ ØØ§ÙØªÙØ§).
The whole mechanics is hidden from our eyes. It only matters in subtle cases, such as when a method is obtained dynamically from the object, using an expression.
Ø§ÙØªØ¹ÙÙÙØ§Øª
<code>Ø ÙÙÙÙØ«Ùر Ù Ù Ø§ÙØ³Ø·Ùر استخدÙ<pre>Ø ÙÙØ£Ùثر Ù Ù 10 Ø³Ø·ÙØ± استخد٠(plnkr, JSBin, codepenâ¦)