Javascript: Przypisać this, czyli metoda apply i call obiektu Function

Czasami, szczególnie przy obiektowym javascriptcie istnieje potrzeba określenia czym jest this w danej funkcji/metodzie. Istnieją dwa sposoby określenia this, za pomocą metod apply i call obiektu Function:

function car() {
    this.name = 'car';
}
car.prototype.getName = function() {
    alert('car.getName(): '+this.name);
}
 
function person() {
    this.name = 'person';
}
person.prototype.getName = function() {
     alert('person.getName(): '+this.name);
}
person.prototype.test1 = function(car) {
     car.getName.apply(this);  
}
person.prototype.test2 = function(car) {
     car.getName.call(this);  
}
 
 
var car = new car();
var person = new person();
car.getName();
person.getName();
person.test1(car);
person.test2(car);

Pierwszym parametrem w obydwu metodach jest zmienna, która w wywołanej funkcji/metodzie będzie przypisana do this. Wykonując powyższy kod, tworzymy 2 obiekty, person i car. Wywołujemy po koleji metody getName obudwu obiektów i dostajemy w komunikatach:

car.getName(): car
person.getName(): person

Czyli wszystko standardowo. W obiekcie car this=car, a w obiekcie person this=person; W kolejnych 2 wywołaniach, metody test1 i test2 obiektu person, wywołujemy metode getName obiektu car, przekazując w pierwszym argumencie metod apply/call this, czyli person(bo wywołujemy z poziomu obiektu person). Spodziewamy się wywołać z poziomu obiektu car metode getName z this=person. Brzmi absurdalnie, ale w kolejnych dwóch komunikatach dostajemy:

car.getName(): person
car.getName(): person

Przykład ten nie niesie większego sensu, ale wydaje mi się, że dobrze oddaje ideę działania tych metod. Metody apply i call różnią się sposobem przekazywania dodatkowych argumentów, co nie zostanie omówione w tym artykule.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *