If you're seeing this message, it means we're having trouble loading external resources on our website.

Jeżeli jesteś za filtrem sieci web, prosimy, upewnij się, że domeny *.kastatic.org i *.kasandbox.org są odblokowane.

Główna zawartość

Funkcje statyczne a metody instancyjne

Zanim przejdziemy do Algorytmu 3 (przyspieszenia w kierunku kursora), musimy omówić jeden dość ważny aspekt pracy z wektorami i obiektem PVector: różnicę między używaniem funkcji statycznych i metod instancyjnych.
Zapomnij na chwilę o wektorach i spójrz na poniższy kod:
var x = 0;
var y = 5;
x = x + y;
Całkiem proste, nie? x ma wartość 0, dodajemy do niego y, i teraz x jest równe 5. Moglibysmy napisać odpowiedni kod dość łatwo, opierając się na tym, czego nauczyliśmy się o obiektach PVector.
var v = new PVector(0,0);
var u = new PVector(4,5);
v.add(u);
Wektor v ma wartość (0,0), dodajemy do niego u, i teraz v równe jest (4,5). Proste, prawda?
Spójrzmy na kolejny prosty matematyczny przykład:
var x = 0;
var y = 5;
var z = x + y;
x ma wartość 0, dodajemy do niego y i przechowujemy wynik w nowej zmiennej z. Ani wartość x, ani y nie zmienia się w tym przykładzie! To spostrzeżenie może wydawać się banalne i dość intuicyjne, kiedy mówimy o działaniach matematycznych na liczbach. Jednakże nie jest to tak oczywiste w przypadku działań matematycznych na obiektach PVector. Spróbujmy napisać kod na podstawie tego, co dowiedzieliśmy się do tej pory.
var v = new PVector(0,0);
var u = new PVector(4,5);
var w = v.add(u); // Nie daj się zwieść; to nieprawidłowe!!!
Powyższe mogłoby wydawać się dobrym podejściem, ale nie tak dziala obiekt PVector. Jeśli przyjrzymy się definicji add()...
PVector.prototype.add = function(v) {
this.x = this.x + v.x;
this.y = this.y + v.y;
};
...możemy zauważyć, że ten kod nie osiągnie naszego celu. Po pierwsze, nie zwraca nowego obiektu PVector (nie ma wyrażenia return) i po drugie, zmienia wartość obiektu PVector, na którym został wywołany. Aby dodać dwa obiekty PVectorze sobą i zwrócić nowy obiekt PVector jako wynik, musimy użyć "statycznej" funkcji add().
"Statyczna" funkcja jest funkcją, która zdefiniowana jest w obiekcie, ale nie zmienia właściwości tego obiektu. Więc po co definiować ją w obiekcie? Zazwyczaj ma coś wspólnego z obiektem, więc dołączenie jej do obiektu jest logiczne. Traktuje obiekt bardziej jako przestrzeń nazw. Na przykład wszystkie statyczne funkcje w PVector wykonują pewnego rodzaju manipulacje na przekazanych wewnątrz obiektach PVector i zawsze zwracają jakąś wartość. Równie dobrze moglibyśmy zdefiniować te funkcje globalnie, ale w ten sposób unikamy globalnych funkcji i mamy lepsze sposoby grupowania powiązanych funkcjonalności.
Porównajmy to. Oto jak używamy metody instancyjnej add():
v.add(u);
Ta linia kodu zmodyfikowałaby v, więc nie musielibyśmy zapisywać zwracanej wartości. Natomiast oto jak używamy statycznej funkcji add():
var w = PVector.add(v, u);
Gdybyśmy nie zapisali wyniku tej funkcji do zmiennej, ta linia kodu byłaby bezużyteczna, ponieważ statyczna wersja nie zmienia samych obiektów. Statyczne funkcje PVector pozwalają nam na przeprowadzenie ogólnych działań matematycznych na obiektach PVector bez potrzeby zmiany wartości jednego z PVectorów na wejściu.
Oto jak moglibyśmy napisać statyczną wersję add():
PVector.add = function(v1, v2) {
var v3 = new PVector(v1.x + v2.x, v1.y + v2.y);
return v3;
};
Jest tutaj kilka różnic:
  • Definiujemy funkcję bezpośrednio na obiekcie, nie na jego prototypie
  • Nigdy nie używamy słowa kluczowego thiswewnątrz funkcji
  • Zwracamy wartość funkcji
Obiekt PVector posiada statyczne wersje add(), sub(), mult() i div(). Posiada także dodatkowe funkcje statyczne, które nie istnieją jako metody instancyjne, takie jak angleBetween(), dot() i cross(). Będziemy używać tych funkcji podczas dalszego tworzenia programów z użyciem PVector.
Ten kurs "Symulacje Natury" jest pochodną z "Natury Kodu " stworzonej przez Daniela Shiffmana, użytej pod licencją Creative Commons Attribution-NonCommercial 3.0 Unported License.

Chcesz dołączyć do dyskusji?

Na razie brak głosów w dyskusji
Rozumiesz angielski? Kliknij tutaj, aby zobaczyć więcej dyskusji na angielskiej wersji strony Khan Academy.