ÐбâÑкÑи зазвиÑай ÑÑвоÑÑÑÑÑÑÑ Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ ÑÑÑноÑÑей ÑеалÑного ÑвÑÑÑ, ÑÐ°ÐºÐ¸Ñ Ñк коÑиÑÑÑваÑÑ, Ð·Ð°Ð¼Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÑоÑо:
let user = {
name: "Ðван",
age: 30
};
Рв ÑеалÑÐ½Ð¾Ð¼Ñ ÑвÑÑÑ ÐºÐ¾ÑиÑÑÑÐ²Ð°Ñ Ð¼Ð¾Ð¶Ðµ дÑÑÑи: вибÑаÑи ÑоÑÑ Ñз коÑика Ð´Ð»Ñ Ð¿Ð¾ÐºÑпок, авÑоÑизÑваÑиÑÑ, Ð²Ð¸Ñ Ð¾Ð´Ð¸Ñи Ñз ÑиÑÑеми ÑоÑо.
ÐÑÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð² JavaScript ÑÑнкÑÑÑми Ñ Ð²Ð»Ð°ÑÑивоÑÑÑÑ Ð¾Ð±âÑкÑа.
ÐÑиклади меÑодÑв
ÐÐ»Ñ Ð¿Ð¾ÑаÑÐºÑ Ð½Ð°Ð²ÑÑмо user вÑÑаÑиÑÑ:
let user = {
name: "Ðван",
age: 30
};
user.sayHi = function() {
alert("ÐÑивÑÑ!");
};
user.sayHi(); // ÐÑивÑÑ!
ТÑÑ Ð¼Ð¸ Ñойно викоÑиÑÑали Function Expression (ÑÑнкÑÑоналÑний виÑаз) Ð´Ð»Ñ ÑÑвоÑÐµÐ½Ð½Ñ ÑÑнкÑÑÑ Ñа пÑиÑвоÑли ÑÑ Ð²Ð»Ð°ÑÑивоÑÑÑ user.sayHi обâÑкÑа.
ÐоÑÑм ми викликали ÑÑ Ð·Ð°Ð²Ð´Ñки user.sayHi(). ÐоÑиÑÑÑÐ²Ð°Ñ ÑÐµÐ¿ÐµÑ Ð¼Ð¾Ð¶Ðµ говоÑиÑи!
ФÑнкÑÑÑ, Ñка Ñ Ð²Ð»Ð°ÑÑивÑÑÑÑ Ð¾Ð±âÑкÑа, називаÑÑÑÑÑ Ð¹Ð¾Ð³Ð¾ меÑодом.
ÐÑже, ми оÑÑимали меÑод sayHi обâÑкÑа user.
ÐвиÑайно, ми могли б викоÑиÑÑовÑваÑи попеÑеднÑо оголоÑÐµÐ½Ñ ÑÑнкÑÑÑ Ñк меÑод, напÑиклад:
let user = {
// ...
};
// ÑпоÑаÑÐºÑ ÑÑвоÑимо ÑÑнкÑÑÑ
function sayHi() {
alert("ÐÑивÑÑ!");
}
// поÑÑм додамо ÑÑ Ñк меÑод
user.sayHi = sayHi;
user.sayHi(); // ÐÑивÑÑ!
Ðоли ми пиÑемо Ð½Ð°Ñ ÐºÐ¾Ð´, викоÑиÑÑовÑÑÑи обâÑкÑи Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ ÑÑÑноÑÑей, Ñе називаÑÑÑÑÑ Ð¾Ð±âÑкÑно-оÑÑÑнÑоване пÑогÑамÑваннÑ, ÑкоÑоÑено: âÐÐÐâ.
ÐÐÐ Ñ Ð²ÐµÐ»Ð¸ÐºÐ¾Ñ Ð¿ÑедмеÑÐ½Ð¾Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ñ ÑÑÐºÐ°Ð²Ð¾Ñ Ð½Ð°ÑÐºÐ¾Ñ Ñаме по ÑобÑ. Як пÑавилÑно обÑаÑи ÑÑÑноÑÑÑ? Як оÑганÑзÑваÑи взаÑмодÑÑ Ð¼Ñж ними? Це аÑÑ ÑÑекÑÑÑа, Ñ Ð½Ð° ÑÑ ÑÐµÐ¼Ñ Ñ ÑÑÐ´Ð¾Ð²Ñ ÐºÐ½Ð¸Ð³Ð¸, ÑÐ°ÐºÑ Ñк âШаблони пÑоÑкÑÑваннÑ: елеменÑи багаÑоÑазового обâÑкÑно-оÑÑÑнÑованого пÑогÑамного забезпеÑеннÑâ Ð. Ðамми, Ð . Хелма, Ð . ÐжонÑона, Ðж. ÐÑÑÑÑдеÑа або âÐбâÑкÑно-оÑÑÑнÑований аналÑз Ñа дизайн з заÑÑоÑÑнкамиâ Ð. ÐÑÑа Ñа Ñн.
СкоÑоÑений Ð·Ð°Ð¿Ð¸Ñ Ð¼ÐµÑодÑ
ÐÑнÑÑ ÐºÐ¾ÑоÑÑий ÑинÑакÑÐ¸Ñ Ð´Ð»Ñ Ð¼ÐµÑодÑв в лÑÑеÑÐ°Ð»Ñ Ð¾Ð±âÑкÑа:
// Ñей обâÑÐºÑ ÑобиÑÑ Ñе ж Ñаме
user = {
sayHi: function() {
alert("ÐÑивÑÑ!");
}
};
// ÑкоÑоÑений меÑод виглÑÐ´Ð°Ñ ÐºÑаÑе, Ñи не Ñак?
user = {
sayHi() { // Ñе ж Ñаме Ñо й "sayHi: function(){...}"
alert("ÐÑивÑÑ!");
}
};
Як бÑло показано, ми можемо опÑÑÑиÑи "function" Ñ Ð½Ð°Ð¿Ð¸ÑаÑи пÑоÑÑо sayHi().
СлÑд вÑдзнаÑиÑи, Ñо ÑÑ Ð¿Ð¾Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ð½Ðµ Ñ Ð¿Ð¾Ð²Ð½ÑÑÑÑ ÑденÑиÑними. ÐÑнÑÑÑÑ ÑÐ¾Ð½ÐºÑ Ð²ÑдмÑнноÑÑÑ, повâÑÐ·Ð°Ð½Ñ Ð· наÑлÑдÑваннÑм обâÑкÑÑв (пÑо ÑÐºÑ Ð¿Ñде мова пÑзнÑÑе), але наÑÐ°Ð·Ñ Ð²Ð¾Ð½Ð¸ не маÑÑÑ Ð·Ð½Ð°ÑеннÑ. Ðайже Ñ Ð²ÑÑÑ Ð²Ð¸Ð¿Ð°Ð´ÐºÐ°Ñ ÑкоÑоÑений ÑинÑакÑÐ¸Ñ ÐºÑаÑе.
âthisâ в меÑодаÑ
Як пÑавило, меÑод обâÑкÑа повинен оÑÑимÑваÑи доÑÑÑп до ÑнÑоÑмаÑÑÑ, Ñо збеÑÑгаÑÑÑÑÑ Ð² обâÑкÑÑ, Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÑвоÑÑ ÑобоÑи.
ÐапÑиклад, ÐºÐ¾Ð´Ñ Ð²ÑеÑÐµÐ´Ð¸Ð½Ñ user.sayHi() може знадобиÑиÑÑ ÑмâÑ, Ñо збеÑÑгаÑÑÑÑÑ Ð² обâÑкÑÑ user.
ÐÐ»Ñ Ð´Ð¾ÑÑÑÐ¿Ñ Ð´Ð¾ ÑнÑоÑмаÑÑÑ Ð²ÑеÑÐµÐ´Ð¸Ð½Ñ Ð¾Ð±âÑкÑа меÑод може викоÑиÑÑовÑваÑи клÑÑове Ñлово this.
ÐнаÑеннÑм this Ñ Ð¾Ð±âÑÐºÑ âпеÑед кÑапкоÑâ, Ñкий викоÑиÑÑовÑÑÑÑÑÑ Ð´Ð»Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ Ð¼ÐµÑодÑ.
ÐапÑиклад:
let user = {
name: "Ðван",
age: 30,
sayHi() {
// "this" -- Ñе "поÑоÑний обâÑкÑ"
alert(this.name);
}
};
user.sayHi(); // Ðван
ТÑÑ Ð¿Ñд ÑÐ°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð´Ñ user.sayHi(), знаÑеннÑм this бÑде user.
Також можна оÑÑимаÑи доÑÑÑп до обâÑкÑа без ÑÑого, поÑилаÑÑиÑÑ Ð½Ð° нÑого ÑеÑез зовнÑÑÐ½Ñ Ð·Ð¼ÑннÑ:
let user = {
name: "Ðван",
age: 30,
sayHi() {
alert(user.name); // викоÑиÑÑовÑÑмо змÑÐ½Ð½Ñ "user" замÑÑÑÑ "this"
}
};
â¦Ðле Ñакий код ненадÑйний. ЯкÑо ми виÑÑÑимо ÑкопÑÑваÑи user в ÑнÑÑ Ð·Ð¼ÑннÑ, напÑ. admin = user пеÑезапиÑаÑи user ÑимоÑÑ ÑнÑим, ÑÐ¾Ð´Ñ Ñей код оÑÑÐ¸Ð¼Ð°Ñ Ð´Ð¾ÑÑÑп до непÑавилÑного обâÑкÑа.
Це пÑодемонÑÑÑовано нижÑе:
let user = {
name: "Ðван",
age: 30,
sayHi() {
alert( user.name ); // пÑизводиÑÑ Ð´Ð¾ помилки
}
};
let admin = user;
user = null; // пеÑезапиÑемо знаÑÐµÐ½Ð½Ñ Ð·Ð¼ÑÐ½Ð½Ð¾Ñ Ð´Ð»Ñ Ð½Ð°Ð¾ÑноÑÑÑ
admin.sayHi(); // TypeError: Cannot read property 'name' of null
ЯкÑо ми викоÑиÑÑовÑÑмо this.name замÑÑÑÑ user.name вÑеÑÐµÐ´Ð¸Ð½Ñ alert, ÑÐ¾Ð´Ñ Ñей код бÑде пÑаÑÑваÑи.
âthisâ не Ñ ÑÑкÑованим
Ð JavaScript, клÑÑове Ñлово this поводиÑÑ Ñебе не Ñак, Ñк в бÑлÑÑоÑÑÑ Ð¼Ð¾Ð² пÑогÑамÑваннÑ.
Ð ÑÑÐ¾Ð¼Ñ ÐºÐ¾Ð´Ñ Ð½ÐµÐ¼Ð°Ñ ÑинÑакÑиÑÐ½Ð¾Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸:
function sayHi() {
alert( this.name );
}
ÐнаÑÐµÐ½Ð½Ñ this обÑиÑлÑÑÑÑÑÑ Ð¿Ñд ÑÐ°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñ Ð·Ð°Ð»ÐµÐ¶Ð¸ÑÑ Ð²Ñд конÑекÑÑÑ.
ÐапÑиклад, ÑÑÑ Ð¾Ð´Ð½Ð° й Ñа ж ÑÑнкÑÑÑ Ð¿ÑизнаÑена двом ÑÑзним обâÑкÑам Ñ Ð¼Ð°Ñ ÑÑзний âthisâ пÑи Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ :
let user = { name: "Ðван" };
let admin = { name: "ÐдмÑн" };
function sayHi() {
alert( this.name );
}
// викоÑиÑÑовÑÑмо Ð¾Ð´Ð½Ñ Ñ ÑÑ Ð¶ ÑÑнкÑÑÑ Ñ Ð´Ð²Ð¾Ñ
обâÑкÑаÑ
user.f = sayHi;
admin.f = sayHi;
// виклики ÑÑнкÑÑй, пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð½Ð¸Ð¶Ñе, маÑÑÑ ÑÑÐ·Ð½Ñ this
// "this" вÑеÑÐµÐ´Ð¸Ð½Ñ ÑÑнкÑÑÑ Ñ Ð¿Ð¾ÑиланнÑм на обâÑÐºÑ "пеÑед кÑапкоÑ"
user.f(); // Ðван (this == user)
admin.f(); // ÐдмÑн (this == admin)
admin['f'](); // ÐдмÑн (неважливо Ñе, Ñк звеÑÑаÑиÑÑ Ð´Ð¾ меÑÐ¾Ð´Ñ Ð¾Ð±âÑкÑа -- ÑеÑез кÑÐ°Ð¿ÐºÑ Ñи квадÑаÑÐ½Ñ Ð´Ñжки)
ÐÑавило пÑоÑÑе: ÑкÑо obj.f() викликано, Ñо this Ñе obj пÑд ÑÐ°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ f. Так Ñо в Ð´Ð°Ð½Ð¾Ð¼Ñ Ð¿ÑÐ¸ÐºÐ»Ð°Ð´Ñ Ñе user або admin.
this == undefinedÐи можемо навÑÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñи ÑÑнкÑÑÑ Ð²Ð·Ð°Ð³Ð°Ð»Ñ Ð±ÐµÐ· обâÑкÑа:
function sayHi() {
alert(this);
}
sayHi(); // undefined
Ð ÑÐ°ÐºÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ this Ñ undefined в ÑÑвоÑÐ¾Ð¼Ñ ÑÐµÐ¶Ð¸Ð¼Ñ ("use strict"). ЯкÑо ми ÑпÑобÑÑмо звеÑнÑÑиÑÑ Ð´Ð¾ this.name ÑÑапиÑÑÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°.
У неÑÑвоÑÐ¾Ð¼Ñ ÑÐµÐ¶Ð¸Ð¼Ñ Ð·Ð½Ð°ÑеннÑм this в ÑÐ°ÐºÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ Ð±Ñде глобалÑний обâÑÐºÑ (window Ñ Ð±ÑаÑзеÑÑ, ми дÑйдемо до нÑого пÑзнÑÑе в Ð³Ð»Ð°Ð²Ñ ÐлобалÑний обâÑкÑ). Це â поведÑнка, Ñка ÑклалаÑÑ ÑÑÑоÑиÑно Ñа випÑавлÑÑÑÑÑÑ Ð·Ð°Ð²Ð´Ñки викоÑиÑÑÐ°Ð½Ð½Ñ ÑÑвоÑого ÑÐµÐ¶Ð¸Ð¼Ñ ("use strict").
ÐазвиÑай Ñакий виклик Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¾Ñ Ð¿ÑогÑамÑваннÑ. ЯкÑо вÑеÑÐµÐ´Ð¸Ð½Ñ ÑÑнкÑÑÑ Ñ this, вона оÑÑкÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ Ð² конÑекÑÑÑ Ð¾Ð±âÑкÑа.
thisЯкÑо ви пÑийÑли з ÑнÑÐ¾Ñ Ð¼Ð¾Ð²Ð¸ пÑогÑамÑваннÑ, Ñо ви, мабÑÑÑ, звикли до ÑÐ´ÐµÑ âзвâÑзаного thisâ, де меÑоди, визнаÑÐµÐ½Ñ Ð² обâÑкÑÑ, завжди маÑÑÑ this, Ñо поÑилаÑÑÑÑÑ Ð½Ð° Ñей обâÑкÑ.
Ð JavaScript this Ñ âвÑлÑнимâ, його знаÑÐµÐ½Ð½Ñ Ð¾Ð±ÑиÑлÑÑÑÑÑÑ Ð¿Ñд ÑÐ°Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ Ñ Ð½Ðµ залежиÑÑ Ð²Ñд Ñого, де меÑод бÑв оголоÑений, а вÑд Ñого, Ñкий обâÑÐºÑ âпеÑед кÑапкоÑâ.
ÐонÑÑÑÑ this, Ñо визнаÑаÑÑÑÑÑ Ð² пÑоÑеÑÑ ÑобоÑи Ð¼Ð°Ñ Ñк плÑÑи, Ñак Ñ Ð¼ÑнÑÑи. Родного бокÑ, ÑÑнкÑÑÑ Ð¼Ð¾Ð¶Ð½Ð° викоÑиÑÑовÑваÑи повÑоÑно Ð´Ð»Ñ ÑÑзниÑ
обâÑкÑÑв. Ð ÑнÑого бокÑ, бÑлÑÑа гнÑÑкÑÑÑÑ ÑÑвоÑÑÑ Ð±ÑлÑÑе можливоÑÑей Ð´Ð»Ñ Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº.
ТÑÑ Ð½Ð°Ñа позиÑÑÑ Ð¿Ð¾Ð»ÑÐ³Ð°Ñ Ð½Ðµ в ÑомÑ, Ñоб ÑÑдиÑи, добÑе Ñи погане Ñаке ÑÑÑÐµÐ½Ð½Ñ Ñодо Ð´Ð¸Ð·Ð°Ð¹Ð½Ñ Ð¼Ð¾Ð²Ð¸. Ðи зÑозÑмÑÑмо, Ñк з Ñим пÑаÑÑваÑи, Ñк оÑÑимаÑи пеÑеваги Ñа ÑникнÑÑи пÑоблем.
СÑÑÑÐ»ÐºÐ¾Ð²Ñ ÑÑнкÑÑÑ Ð½Ðµ маÑÑÑ âthisâ
СÑÑÑÐ»ÐºÐ¾Ð²Ñ ÑÑнкÑÑÑ Ð¾ÑобливÑ: Ñ Ð½Ð¸Ñ
Ð½ÐµÐ¼Ð°Ñ âÑвогоâ this. ЯкÑо ми поÑилаÑмоÑÑ Ð½Ð° this з ÑÐ°ÐºÐ¾Ñ ÑÑнкÑÑÑ, його знаÑÐµÐ½Ð½Ñ Ð±ÐµÑеÑÑÑÑ Ñз зовнÑÑнÑÐ¾Ñ âноÑмалÑноÑâ ÑÑнкÑÑÑ.
ÐапÑиклад, ÑÑÑ arrow() викоÑиÑÑовÑÑ this Ñз зовнÑÑнÑого user.sayHi() меÑодÑ:
let user = {
firstName: "ÐллÑ",
sayHi() {
let arrow = () => alert(this.firstName);
arrow();
}
};
user.sayHi(); // ÐллÑ
Це оÑобливÑÑÑÑ ÑÑÑÑлковиÑ
ÑÑнкÑÑй Ñ ÐºÐ¾ÑиÑÐ½Ð¾Ñ ÐºÐ¾Ð»Ð¸ ми не Ñ
оÑемо маÑи окÑеме this, а лиÑе взÑÑи його Ñз зовнÑÑнÑого конÑекÑÑÑ. ÐÐ°Ð»Ñ Ð² Ð³Ð»Ð°Ð²Ñ ÐовÑоÑÐµÐ½Ð½Ñ ÑÑÑÑлковиÑ
ÑÑнкÑÑй ми деÑалÑнÑÑе ÑозглÑнемо ÑÑÑÑÐ»ÐºÐ¾Ð²Ñ ÑÑнкÑÑÑ.
ÐÑдÑÑмки
-
ФÑнкÑÑÑ, ÑÐºÑ Ð·Ð±ÐµÑÑгаÑÑÑÑÑ Ñ Ð²Ð»Ð°ÑÑивоÑÑÑÑ Ð¾Ð±âÑкÑа, називаÑÑÑÑÑ âмеÑодамиâ.
-
ÐеÑоди дозволÑÑÑÑ Ð¾Ð±âÑкÑам âдÑÑÑиâ подÑбно до
object.doSomething(). -
ÐеÑоди можÑÑÑ Ð¿Ð¾ÑилаÑиÑÑ Ð½Ð° обâÑÐºÑ Ð·Ð°Ð²Ð´Ñки
this. -
ÐнаÑеннÑ
thisвизнаÑаÑÑÑÑÑ Ð¿Ñд ÑÐ°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ. -
Ðоли ÑÑнкÑÑÑ Ð¾Ð³Ð¾Ð»Ð¾Ñена, вона може викоÑиÑÑовÑваÑи
this, але Ñамеthisне Ð¼Ð°Ñ Ð·Ð½Ð°ÑеннÑ, доки ÑÑнкÑÑÑ Ð½Ðµ бÑде викликана. -
ФÑнкÑÑÑ Ð¼Ð¾Ð¶Ð½Ð° копÑÑваÑи мÑж обâÑкÑами.
-
Ðоли ÑÑнкÑÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°ÑÑÑÑÑ Ð² ÑинÑакÑиÑÑ âмеÑодÑâ:
object.method(), знаÑеннÑthisпÑд ÑÐ°Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ Ñobjectâ обâÑÐºÑ Ð¿ÐµÑед кÑапкоÑ.
ÐвеÑнÑÑÑ ÑвагÑ, Ñо ÑÑÑÑÐ»ÐºÐ¾Ð²Ñ ÑÑнкÑÑÑ Ñ Ð¾Ñобливими: Ñ Ð½Ð¸Ñ
Ð½ÐµÐ¼Ð°Ñ this. Ðоли вÑеÑÐµÐ´Ð¸Ð½Ñ ÑÑÑÑÐ»ÐºÐ¾Ð²Ð¾Ñ ÑÑнкÑÑÑ Ð·Ð²ÐµÑÑаÑÑÑÑÑ Ð´Ð¾ this, Ñо його знаÑÐµÐ½Ð½Ñ Ð±ÐµÑеÑÑÑÑ Ð·Ð·Ð¾Ð²Ð½Ñ.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)