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

Ако си зад уеб филтър, моля, увери се, че домейните *. kastatic.org и *. kasandbox.org са разрешени.

Основно съдържание

Статични функции срещу методи

Преди да стигнем до Алгоритъм #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.

Искаш ли да се присъединиш към разговора?

Все още няма публикации.
Разбираш ли английски? Натисни тук, за да видиш още дискусии в английския сайт на Кан Академия.