Funcția ca obiect - Metodele call și apply
În JavaScript, funcția este, de asemenea, un obiect - un obiect de tipul Function și are, de asemenea, un prototip, proprietăți și metode. Toate funcțiile utilizate în program sunt obiecte de tip Function și au toate proprietățile și metodele sale.
De exemplu, putem crea o funcție folosind constructorul Function:
const square = new Function("n", "return n * n;");
console.log(square(5)); // 25
În constructorul Function pot fi transmiși mai mulți parametri. Ultimul parametru reprezintă corpul funcției în sine sub formă de șir de caractere. Practic, șirul conține cod JavaScript. Parametrii anteriori conțin numele parametrilor. În acest caz, este definită o funcție care ridică un număr la pătrat, având un singur parametru n.
Dintre proprietățile obiectului Function, pot fi evidențiate următoarele:
- arguments: o matrice de argumente transmise la funcție
- length: determină numărul de argumente pe care funcția le așteaptă
- caller: determină funcția care a apelat funcția curentă în execuție
- name: numele funcției
- prototype: prototipul funcției
Cu ajutorul prototipului, putem defini proprietăți suplimentare:
function sayHello(){
console.log("Hello");
}
// modificăm prototipul pentru toate funcțiile
Function.prototype.program ="Hello World";
console.log(sayHello.program); // Hello World
Dintre metode trebuie menționate metodele call() și apply().
Metoda call() apelează funcția cu o valoare specificată pentru this și cu argumente specificate:
function sum(x, y){
return x + y;
}
const result = sum.call(this, 3, 8);
console.log(result); // 11
this indică obiectul pentru care este apelată funcția - în acest caz, este obiectul global window. După this, sunt transmise valorile pentru parametri.
Prin transmiterea unui obiect ca prim parametru, putem face referire la el folosind cuvântul cheie this:
function User (name, age) {
this.name = name;
this.age = age;
}
const tom = new User("Tom", 39);
function print(){
console.log("Name:", this.name);
}
print.call(tom); // Name: Tom
În acest caz, este transmisă doar o singură valoare, deoarece funcția print nu primește parametri. Cu alte cuvinte, funcția va fi apelată pentru obiectul tom.
Dacă nu ne pasă despre obiectul pentru care este apelată funcția, putem transmite valoarea null:
function sum(x, y){
return x + y;
}
const result = sum.call(null, 3, 8);
console.log(result); // 11
Metoda call() are o variantă similară numită apply(), care de asemenea apelează o funcție și primește un obiect ca primul parametru. Însă, în acest caz, al doilea parametru este un array de argumente:
function sum(x, y){
return x + y;
}
const result = sum.apply(null, [3, 8]);
console.log(result); // 11