Ð¦Ñ ÑÑаÑÑÑ Ð¾Ñ Ð¾Ð¿Ð»ÑÑ ÑÐºÐ»Ð°Ð´Ð½Ñ ÑемÑ, Ñоб кÑаÑе зÑозÑмÑÑи Ð¿ÐµÐ²Ð½Ñ ÐºÑÐ°Ð¹Ð½Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÐ¸.
Це не Ñ Ð²Ð°Ð¶Ð»Ð¸Ð²Ð¸Ð¼. ÐагаÑо доÑвÑдÑÐµÐ½Ð¸Ñ ÑозÑобникÑв живÑÑÑ Ð´Ð¾Ð±Ñе, не знаÑÑи ÑÑого. ÐÑоÑиÑайÑе, ÑкÑо ви Ñ Ð¾ÑеÑе знаÑи, Ñк Ð¿ÐµÐ²Ð½Ñ ÑеÑÑ Ð¿ÑаÑÑÑÑÑ Ð¿Ñд капоÑом.
ÐинамÑÑно обÑиÑлений виклик меÑÐ¾Ð´Ñ Ð¼Ð¾Ð¶Ðµ вÑÑаÑиÑи this.
ÐапÑиклад:
let user = {
name: "Ðван",
hi() { alert(this.name); },
bye() { alert("Ðо побаÑеннÑ"); }
};
user.hi(); // пÑаÑÑÑ
// ÑÐµÐ¿ÐµÑ Ð²Ð¸ÐºÐ»Ð¸Ñмо user.hi або user.bye залежно вÑд назви
(user.name == "Ðван" ? user.hi : user.bye)(); // Ðомилка!
Ðа оÑÑаннÑÐ¾Ð¼Ñ ÑÑÐ´ÐºÑ Ñ Ñмовний опеÑаÑоÑ, Ñкий вибиÑÐ°Ñ Ð°Ð±Ð¾ user.hi або user.bye. У ÑÑÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ ÑезÑлÑÑÐ°Ñ â user.hi.
ÐоÑÑм меÑод негайно викликаÑÑÑÑÑ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Ð´Ñжок (). Ðле Ñе пÑаÑÑÑ Ð½ÐµÐ¿ÑавилÑно!
Як ви баÑиÑе, виклик пÑизводиÑÑ Ð´Ð¾ помилки, ÑÐ¾Ð¼Ñ Ñо знаÑÐµÐ½Ð½Ñ "this" вÑеÑÐµÐ´Ð¸Ð½Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ ÑÑÐ°Ñ undefined.
Це пÑаÑÑÑ (меÑод обâÑкÑа ÑеÑез кÑапкÑ):
user.hi();
Це Ð½Ñ (динамÑÑно обÑиÑлений меÑод):
(user.name == "Ðван" ? 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 - Ñе undefined
ТÑÑ hi = user.hi помÑÑÐ°Ñ ÑÑнкÑÑÑ Ð² змÑннÑ, а на наÑÑÑÐ¿Ð½Ð¾Ð¼Ñ ÑÑдкÑ, ÑÑ Ð·Ð¼Ñнна повнÑÑÑÑ Ð°Ð²Ñономна, Ñ ÑÐ¾Ð¼Ñ Ð½Ðµ Ð¼Ð°Ñ this.
Щоб зÑобиÑи виклик user.hi() ÑобоÑим, JavaScript викоÑиÑÑовÑÑ ÑÑÑк â кÑапка '.' повеÑÑÐ°Ñ Ð½Ðµ ÑÑнкÑÑÑ, а знаÑÐµÐ½Ð½Ñ ÑпеÑÑалÑного поÑилалÑного ÑипÑ.
ÐоÑилалÑний Ñип â Ñе âÑип ÑпеÑиÑÑкаÑÑÑâ. Ðи не можемо Ñвно викоÑиÑÑовÑваÑи його, але вÑн викоÑиÑÑовÑÑÑÑÑÑ Ð²ÑеÑÐµÐ´Ð¸Ð½Ñ Ð¼Ð¾Ð²Ð¸.
ÐнаÑÐµÐ½Ð½Ñ Ð¿Ð¾ÑилалÑного ÑÐ¸Ð¿Ñ â Ñе комбÑнаÑÑÑ ÑÑÑоÑ
знаÑÐµÐ½Ñ (base, name, strict), де:
baseâ Ñе обâÑкÑ.nameâ Ñе назва влаÑÑивоÑÑÑ.strictâ Ñе true ÑкÑо дÑÑuse strict.
РезÑлÑÑÐ°Ñ Ð´Ð¾ÑÑÑÐ¿Ñ Ð´Ð¾ влаÑÑивоÑÑÑ user.hi Ñ Ð½Ðµ ÑÑнкÑÑÑÑ, а знаÑеннÑм поÑилалÑного ÑипÑ. ÐÐ»Ñ user.hi Ñ ÑÑвоÑÐ¾Ð¼Ñ ÑÐµÐ¶Ð¸Ð¼Ñ Ñе:
// ÐнаÑÐµÐ½Ð½Ñ Ð¿Ð¾ÑилалÑного ÑипÑ
(user, "hi", true)
Ðоли дÑжки () викликаÑÑÑÑÑ Ð· поÑилалÑним Ñипом, вони оÑÑимÑÑÑÑ Ð¿Ð¾Ð²Ð½Ñ ÑнÑоÑмаÑÑÑ Ð¿Ñо обâÑÐºÑ Ñа його меÑод, Ñ Ð¼Ð¾Ð¶ÑÑÑ Ð²ÑÑановиÑи пÑавилÑний this (user Ñ Ð½Ð°ÑÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ).
ÐоÑилалÑний Ñип â Ñе оÑобливий âпоÑеÑедниÑÑкийâ внÑÑÑÑÑнÑй Ñип, Ñкий викоÑиÑÑовÑÑÑÑÑÑ Ð· меÑÐ¾Ñ Ð¿ÐµÑедаÑÑ ÑнÑоÑмаÑÑÑ Ð²Ñд кÑапки . до дÑжок Ð²Ð¸ÐºÐ»Ð¸ÐºÑ ().
ÐÑдÑ-Ñка ÑнÑа опеÑаÑÑÑ, напÑиклад пÑиÑвоÑÐ½Ð½Ñ hi = user.hi в ÑÑÐ»Ð¾Ð¼Ñ Ð²ÑÐ´ÐºÐ¸Ð´Ð°Ñ Ð¿Ð¾ÑилалÑний Ñип Ñа пÑÐ¸Ð¹Ð¼Ð°Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ user.hi (ÑÑнкÑÑÑ) Ñ Ð¿ÐµÑÐµÐ´Ð°Ñ Ð¹Ð¾Ð³Ð¾. ÐÑже, бÑдÑ-Ñка подалÑÑа опеÑаÑÑÑ âвÑÑаÑаÑâ this.
ÐÑже, Ñк ÑезÑлÑÑаÑ, знаÑÐµÐ½Ð½Ñ this пеÑедаÑÑÑÑÑ Ð¿ÑавилÑно ÑÑлÑки ÑодÑ, коли ÑÑнкÑÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°ÑÑÑÑÑ Ð±ÐµÐ·Ð¿Ð¾ÑеÑеднÑо за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ ÐºÑапки obj.method() або ÑинÑакÑиÑÑ ÐºÐ²Ð°Ð´ÑаÑниÑ
дÑжок obj['method']() (вони ÑоблÑÑÑ Ð¾Ð´Ð½Ðµ й Ñе ж Ñаме). ÐÑнÑÑÑÑ ÑÑÐ·Ð½Ñ ÑпоÑоби ÑозвâÑÐ·Ð°Ð½Ð½Ñ ÑÑÑÑ Ð¿Ñоблеми, напÑиклад func.bind().
ÐÑдÑÑмки
ÐоÑилалÑний Ñип â Ñе внÑÑÑÑÑнÑй Ñип мови.
ЧиÑÐ°Ð½Ð½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ, напÑиклад, кÑÐ°Ð¿ÐºÐ¾Ñ . в obj.method() повеÑÑÐ°Ñ Ð½Ðµ Ñаме знаÑÐµÐ½Ð½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ, але ÑпеÑÑалÑне знаÑÐµÐ½Ð½Ñ âпоÑилалÑного ÑипÑâ, Ñке збеÑÑÐ³Ð°Ñ Ñк знаÑÐµÐ½Ð½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ, Ñак Ñ Ð¾Ð±âÑкÑ, з ÑÐºÐ¾Ñ Ð²Ñн бÑв взÑÑий.
Це викоÑиÑÑовÑÑÑÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð´Ð°Ð»ÑÑого Ð²Ð¸ÐºÐ»Ð¸ÐºÑ Ð¼ÐµÑÐ¾Ð´Ñ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ (), Ñоб оÑÑимаÑи обâÑÐºÑ Ñ Ð²ÑÑановиÑи this пеÑед Ñим.
ÐÐ»Ñ Ð²ÑÑÑ ÑнÑÐ¸Ñ Ð¾Ð¿ÐµÑаÑÑй, поÑилалÑний Ñип авÑомаÑиÑно ÑÑÐ°Ñ Ð·Ð½Ð°ÑеннÑм влаÑÑивоÑÑÑ (ÑÑнкÑÑÑÑ Ñ Ð½Ð°ÑÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ).
УÑÑ ÑÑ Ð¼ÐµÑ Ð°Ð½Ñка пÑÐ¸Ñ Ð¾Ð²Ð°Ð½Ð° вÑд наÑÐ¸Ñ Ð¾Ñей. Це важливо лиÑе в ÑÐ¾Ð½ÐºÐ¸Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÐ°Ñ , напÑиклад, коли меÑод оÑÑимÑÑÑÑÑÑ Ð´Ð¸Ð½Ð°Ð¼ÑÑно з обâÑкÑа, викоÑиÑÑовÑÑÑи виÑаз.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)