Spotykam ten kod w Jsgarden i nie mogę zrozumieć znaczenia łańcucha call i apply razem. Oba wykonują funkcję z danym obiektem kontekstowym, dlaczego może być przykuty?

function Foo() {}

Foo.prototype.method = function(a, b, c) {
    console.log(this, a, b, c);
};

// Create an unbound version of "method" 
// It takes the parameters: this, arg1, arg2...argN
Foo.method = function() {

    // Result: Foo.prototype.method.call(this, arg1, arg2... argN)
    Function.call.apply(Foo.prototype.method, arguments);
};
8
steveyang 26 lipiec 2012, 20:48

2 odpowiedzi

Najlepsza odpowiedź

Zadzwoń do call przez apply; Oznacza to, że jest używany call, aby zadzwonić do funkcji ("metodę"), a używa apply, aby wykonać połączenie, ponieważ ma argumenty w postaci (prawie) tablicy.

Więc zabrać go:

Function.call

To odniesienie do funkcji call() dostępne we wszystkich instancjach funkcji, dziedziczonych z prototypu funkcji.

Function.call.apply

To odniesienie, poprzez odniesienie do funkcji call, do apply. Ponieważ apply odwołuje się za pomocą obiektu call, gdy wywołanie do apply zostanie wykonana wartość this będzie odwołaniem do funkcji call.

Function.call.apply(Foo.prototype.method, arguments);

Więc wywołujemy funkcję call przez apply i przekazuje Foo.prototype.method, aby być wartością this oraz argumentami do "foo.method" jako argumenty.

I myślę Jest to zasadniczo taki sam efekt jak:

Foo.method = function() {
  var obj = arguments[0], args = [].slice.call(arguments, 1);
  Foo.prototype.method.apply(obj, args);
}

Ale będę musiał spróbować, żeby się upewnić. edytuj tak, co wydaje się być tym. Mogę więc podsumować punkt tej sztuczki jako sposób na wywołanie apply(), gdy żądany wartość this jest pierwszym elementem tablicy posiadającej parametry. Innymi słowy, zwykle po nazwie apply() masz żądany odwołanie do obiektu this i masz parametry (w tablicy). Tutaj jednak, ponieważ pomysł polega na tym, że przechodzisz w żądanym this jako parametru, należy go oddzielić w kolejności, aby uzyskać połączenie do apply. Osobiście zrobiłbym to tak jak w moim "tłumaczeniu", ponieważ jest trochę mniejsze umysł (dla mnie), ale przypuszczam, że można go przyzwyczaić. Nie jest to wspólna sytuacja, w moim doświadczeniu.

12
Pointy 26 lipiec 2012, 17:10

apply robi tablicę jako drugi argument , call bierze pojedyncze parametry.

 // lets take call,
 var callfn = Function.prototype.call;
 // an ordinary function from elsewhere
 var method = Foo.prototype.method;
 // and apply the arguments object on it:
 callfn.apply(method, arguments);

Więc pierwsza arguments wartość będzie wartość this method, a następnie wypełnią pojedyncze parametry.

Rezultatem jest funkcja statyczna method na konstruktorze Foo, który bierze instancję Foo (lub coś podobnego) jako pierwszy argument i stosuje prototyp method na nim. Ewentualna usecase miała zdefiniować funkcję Object.hasOwnProperty, która jest zwykle dostępna tylko jako Object.prototype.hasOwnProperty.

Ostatecznie sprawia, że wywołanie jednego "prototypu"}} jednego "prototypu" i jednego "połączenia", jeśli trzeba zastosować go na obiektach, które a) nie dziedziczy go lub b) nadpisywał go.

1
Bergi 26 lipiec 2012, 17:06