Методи функцій
Трапляються ситуації, коли функцію потрібно викликати в контексті об'єкта, при
цьому функція не є його методом. Для цього у функцій є методи call, apply і
bind.
Метод call()
foo.call(obj, arg1, arg2, ...)
Метод call викличе функцію foo таким чином, що в this буде посилання на
об'єкт obj, а також передасть аргументи arg1, arg2 тощо.
function greetGuest(greeting) {
console.log(`${greeting}, ${this.username}.`);
}
const mango = {
username: "Манго",
};
const poly = {
username: "Полі",
};
greetGuest.call(mango, "Ласкаво просимо"); // Ласкаво просимо, Манго.
greetGuest.call(poly, "З прибуттям"); // З прибуттям, Полі.
Метод apply
Метод apply - це аналог методу call за винятком того, що синтаксис передачі
аргументів вимагає не перерахування, а масив, навіть якщо аргумент всього один.
foo.call(obj, arg1, arg2, ...)
foo.apply(obj, [arg1, arg2, ...])
Метод apply викличе функцію foo таким чином, що в this буде посилання на
об'єкт obj, а також передасть елементи масиву як окремі аргументи arg1,
arg2 тощо.
function greetGuest(greeting) {
console.log(`${greeting}, ${this.username}.`);
}
const mango = {
username: "Манго",
};
const poly = {
username: "Полі",
};
greetGuest.apply(mango, ["Ласкаво просимо"]); // Ласкаво просимо, Манго.
greetGuest.apply(poly, ["З прибуттям"]); // З прибуттям, Полі.
Метод bind()
Методи call і apply викликають функцію «на місці», тобто відразу. Але у разі
колбек-функцій, коли необхідно не відразу викликати функцію, а передати
посилання на неї, причому з прив'язаним контекстом, використовується метод
bind.
foo.bind(obj, arg1, arg2, ...)
Метод bind створює і повертає копію функції foo з прив'язаним контекстом
obj і аргументами arg1, arg2 тощо. Утворюється копія функції, яку можна
передати куди завгодно і викликати коли завгодно.
function greet(clientName) {
return `${clientName}, ласкаво просимо в «${this.service}».`;
}
const steam = {
service: "Steam",
};
const steamGreeter = greet.bind(steam);
steamGreeter("Манго"); // "Манго, ласкаво просимо в «Steam»."
const gmail = {
service: "Gmail",
};
const gmailGreeter = greet.bind(gmail);
gmailGreeter("Полі"); // "Полі, ласкаво просимо в «Gmail»."
bind() і методи об'єкта
У разі передачі методів об'єкта як колбек-функцій, контекст не зберігається. Колбек - це посилання на метод, яка присвоюється як значення параметра, що викликається без об'єкта.
const customer = {
firstName: "Jacob",
lastName: "Mercer",
getFullName() {
return `${this.firstName} ${this.lastName}`;
},
};
function makeMessage(callback) {
// callback() - це виклик методу getFullName без об'єкта
console.log(`Обробляємо заявку від ${callback()}.`);
}
makeMessage(customer.getFullName); // Виникне помилка на момент виклику функції
У суворому режимі, значення this в методі getFullName, викликаючи як
колбек-функції callback(), буде undefined. Звертаючись до властивостей
firstName і lastName, виникне помилка, оскільки undefined - це не об'єкт.
Метод bind використовується для прив'язування контексту, передаючи методи
об'єкта як колбек-функції. Передамо колбеком не оригінальний метод
getFullName, а його копію з прив'язаним контекстом об'єкту customer.
// ❌ Було
makeMessage(customer.getFullName); // Виникне помилка на момент виклику функції
// ✅ Стало
makeMessage(customer.getFullName.bind(customer)); // Обробляємо заявку від Jacob Mercer.