Основно съдържание
Курс: Програмиране > Раздел 5
Урок 4: Вектори- Въведение във вектори
- Предизвикателство: Пешеходец по вектор
- Повече векторна математика
- Предизвикателство: Лазерен меч
- Големина на вектора и нормализация
- Предизвикателство: Визуализация на големина
- Движение на вектор
- Предизвикателство: Спиране на кола
- Статични функции срещу методи
- Предизвикателство: Статични функции
- Интерактивно движение на вектор
- Предизвикателство: Следене на мишката
- Проект: Изчислителни същества
© 2024 Khan AcademyУсловия за ползванеДекларация за поверителностПолитика за Бисквитки
Статични функции срещу методи
Преди да стигнем до Алгоритъм #3 (ускорение по посока на мишката), трябва да разгледаме още една важна страна на работата с вектори и с обекта
PVector
: каква е разликата между използването на статични функции и инстанционни методи.За момент забрави за векторите и погледни следния код:
var x = 0;
var y = 5;
x = x + y;
Доста е просто, нали?
x
има стойност 0, добавяме към нея y
и сега x
става равно на 5. Можем съвсем лесно да напишем съответния код, като вземем предвид, това, което научихме за PVector
.var v = new PVector(0,0);
var u = new PVector(4,5);
v.add(u);
Векторът v има стойностт (0,0), добавяме към него u, и сега v е равно на (4,5). Лесно, нали?
Да разгледаме още един пример с просто математическо изчисление:
var x = 0;
var y = 5;
var z = x + y;
x
има стойност 0, добавяме към него y
и запазваме резултата в нова променлива z
. В този пример не се променя нито стойността на x
, нито стойността на y! Този пример изглежда незначителен и доста интуитивен, що се отнася до математически операции с числа. Това обаче не е така очевидно при математическите операции с PVector
. Да се опитаме да напишем кода предвид това, което научихме досега.var v = new PVector(0,0);
var u = new PVector(4,5);
var w = v.add(u); // Не се подвеждай; това не е правилно!!!
Горното може да изглежда като добро предположение, но това не е начинът, по който работи обектът
PVector
. Ако разгледаме дефинията на метода add()
...PVector.prototype.add = function(v) {
this.x = this.x + v.x;
this.y = this.y + v.y;
};
...виждаме, че този код не постига нашата цел. Първо, той не ни връща нов обект
PVector
(в него няма команда return
) и второ, той променя стойността на обекта PVector
, върху който е извикан. За да можем да съберем два обекта PVector
и да върнем като резултат нов обект PVector
, трябва да използваме "статичната" фунцкия add()
."Статична" функция е функция, която е дефинирана върху обект, но не променя свойствата на този обект. Защо тогава изобщо да я дефинираме върху обект? Обикновено тази функция има нещо общо с обекта, затова е логически свързана с него. Например всички статични функции върху обекта
PVector
манипулират по някакъв начин подадените им PVector
обекти и винаги връщат някаква стойност. Можем да дефинираме тези функции и като глобални, но по този начин избягваме глобалните функци и имаме по-добър начин за групиране на функционалността.Да видим какви са разликите. Ето как използваме инстанционния метод
add()
:v.add(u);
Този ред код ще промени
v
, така че няма да ни е необходим израз return. От друга страна, ето как използваме статичната функция add()
:var w = PVector.add(v, u);
Ако не запазим резултата от тази функция в променлива, този ред код ще бъде съвсем безполезен, защото статичната версия не променя самите обекти. Статичните функции на
PVector
ни позволяват да изпълняваме общи математически операции върху обект PVector
, без да се налага да нагласяме стойностите на един от подадените обекти PVectors
.Ето как бихме написали статичния вариант на метода
add()
:PVector.add = function(v1, v2) {
var v3 = new PVector(v1.x + v2.x, v1.y + v2.y);
return v3;
};
Има няколко разлики тук:
- Дефинираме функцията директно върху обекта, а не върху неговия прототип
- В тази функция никога не достъпваме ключовата дума
this
- Функцията връща стойност
Обектът PVector има статични версии на функциите
add()
, sub()
, mult()
и div()
. Освен това има и допълнителни статични функции, които не съществуват като инстанционни методи, например angleBetween()
, dot()
и cross()
. Сами ще открием как да използваме тези функции, като продължим да правим програми с обекта PVector
.Курсът "Компютърни симулации на физични явления" е производeн на "Природата на кода" от Даниел Шифман, използвана от Creative Commons Attribution-NonCommercial 3,0 Unported License.
Искаш ли да се присъединиш към разговора?
Все още няма публикации.