Ta strona używa ciasteczek (cookies), dzięki którym nasz serwis może działać lepiej. Dowiedz się więcej OK, rozumiem

Niezrozumiałe wykorzystanie prototypu funkcji

Tworzenie dynamicznych stron internetowych z zastosowaniem JavaScript, jQuery, Ajax. Dowiedz się jak to zrobić, znajdź rozwiązania swoich problemów.

Niezrozumiałe wykorzystanie prototypu funkcji

Post 19.03.2017, 18:35:34

Czesc,

Mam następujący kod:

Kod: Zaznacz cały
var VisualiserServices= (function () {
   
var baseUrl = „example”;
   
var dateFormat = 'YYYY-MM-DD';

   

var Services = function () {};


   

function GetTariff() {
     
  console.log();
 
  }



   

Services.prototype.GetTariff = GetTariff;
   
 Services.prototype.BaseUrl = baseUrl;
   
Services.prototype.DateFormat = dateFormat;

   

return Services;


})();



Następnie wykorzystujemy:

var newServis = new VisualiserServices();


Nieistotne jest do czego był wykorzystywany, raczej interesuje mnie dlaczego. Moje pytania:

1. Czy zabieg var Services = function () {};


 powoduje ze pod Services bede miał instancję funkcji? Nie wykorzystujemy tutaj operatora new.
2. Co się dzieje kiedy robimy var newServis = new VisualiserServices();? Wiem, że jeżeli operator new powoduje m. in. zwracanie obiektu this, a jeżeli funkcja zwraca inny obiekt, to zwrócony będzie ten obiekt. Aczkolwiek tutaj po wywołaniu się "samowywołującej się" funkcji, pod
VisualiserServices bede miał Services. Co nam daje new? Co tak naprawdę jest pod newServis?

Zastanawia mnie także, dlaczego użyto prototypu funkcji aby później odwoływać się do zmiennych i metod. Dlaczego nie np. Object?

Proszę o kilka słów wyjaśniających, dziękuję!

Pozdrawiam!
whitty
Posty: 79
Dołączył(a): 12.07.2015

Re: Niezrozumiałe wykorzystanie prototypu funkcji

Post 20.03.2017, 10:31:49

1. Tak, zmienna Services będzie miała wartość będącą funkcją.
2. new VisualiserServices będzie w tym momencie === new Services() (tyle, że Services to zmienna widoczna tylko w tym IIFE) i to utworzy nowy obiekt, który w swoim prototypie będzie miał metody i właściwości GetTariff, baseUrl, dateFormat. Gdybyś wywołał VisualiserServices bez new, to newServis miałby wartość undefined, ponieważ funkcja przypisana do VisualiserServices jest pusta, nic nie robi i nic nie zwraca.

Zastanawia mnie także, dlaczego użyto prototypu funkcji aby później odwoływać się do zmiennych i metod. Dlaczego nie np. Object?

nie rozumiem.
Avatar użytkownikakuku
Rafał Kukawski

+∞
+∞

Posty: 19410
Dołączył(a): 14.04.2002

Re: Niezrozumiałe wykorzystanie prototypu funkcji

Post 20.03.2017, 21:20:58

A czy var Services = function () {};


 to to samo co var Services = new Function()?

I jeżeli przypisujemy właściwości na prototypie funkcji, to czy dzięki dziedziczeniu prototypowemu każda obiekt funkcji będzie miał dostęp do tych właściwości, czy tylko Services?


Zastanawia mnie także, dlaczego użyto prototypu funkcji aby później odwoływać się do zmiennych i metod. Dlaczego nie np. Object?


Chodziło mi to czy np. mógłbym zrobić to samo ale z wykorzystaniem np. tablic, czyli:

var Services = [];

Wcześniej użyto konkretnie obiektu funkcji.

Dziękuję jak zawsze za pomoc Kuku.
whitty
Posty: 79
Dołączył(a): 12.07.2015

Re: Niezrozumiałe wykorzystanie prototypu funkcji

Post 20.03.2017, 23:27:31

A czy var Services = function () {};


 to to samo co var Services = new Function()?

jedno i drugie tworzy funkcję, więc odpowiedź brzmi "w zasadzie tak".

jeżeli przypisujemy właściwości na prototypie funkcji, to czy dzięki dziedziczeniu prototypowemu każda obiekt funkcji będzie miał dostęp do tych właściwości, czy tylko Services?

jeśli chcesz, żeby każda funkcja miała określone właściwości, to musisz dopisać je do

Kod: Zaznacz cały
Function.prototype


Przypisując coś do
Kod: Zaznacz cały
Services.prototype

definiujesz właściwości dostępne na obiektach, które powstaną po wykonaniu
Kod: Zaznacz cały
new Services()


Chodziło mi to czy np. mógłbym zrobić to samo ale z wykorzystaniem np. tablic, czyli:

var Services = [];

no nie bardzo. W sensie takim, jeśli Services będzie tablicą, to nie da się użyć nazwy Services razem z new, ponieważ Services nie jest funkcją-konstruktorem tylko jest tablicą.
Obiekt tablicowy nie ma właściwości prototype, ponieważ takie właściwości posiadają funkcje-konstruktury. A takimi konstruktorami są m.in. Array, String, Boolean, Number, ..., oraz funkcje tworzone przez Ciebie poprzez użycie definicji funkcji, wyrażenia funkcyjnego lub new Function.
Avatar użytkownikakuku
Rafał Kukawski

+∞
+∞

Posty: 19410
Dołączył(a): 14.04.2002

Re: Niezrozumiałe wykorzystanie prototypu funkcji

Post 21.03.2017, 19:46:35

No dobrze Kuku, ale zatem jeżeli można przyjąc, że var Services = function() {} daje nam instancję funkcji, to w jaki sposób mogę wykonać new Services() ? Przecież operatora new używa się w sytuacji gdy korzystamy z konstruktora / klasy, a nie instancji.


Odnosi sie to także do:

no nie bardzo. W sensie takim, jeśli Services będzie tablicą, to nie da się użyć nazwy Services razem z new, ponieważ Services nie jest funkcją-konstruktorem tylko jest tablicą.


function() {} tez nie jest konstruktorem, zatem czegoś nie zrozumiałem.

Proszę Cie jeszcze o kilka słów wyjasnienia.
whitty
Posty: 79
Dołączył(a): 12.07.2015

Re: Niezrozumiałe wykorzystanie prototypu funkcji

Post 21.03.2017, 20:30:46

Musimy sobie wyklarować używany przez nas słownik:
Instancją nazwiemy obiekt urworzony z jakiejś klasy poprzez new NazwaKlasy (w JS nie mamy typowego modelu klasowego, tzn. najbliższym odpowiednikiem klasy jest funkcja-konstruktor).

Czyli

Kod: Zaznacz cały
var arr = new Array();
arr instanceof Array; // true

Array jest klasą (funkcją-konstruktorem), arr jest zmienną, której wartością jest instancja klasy Array, czyli obiekt, który ma właściwości i metody charakterystyczne dla tablic).

Kod: Zaznacz cały
var Services = function () {};
var s = new Services();
s instanceof Services; // true


Services jest zmienną, której wartość jest funkcją-konstruktorem.
s jest zmienną, której wartość jest instancja klasy Services.

Wniosek z tego taki - w JS operator new używamy z funkcjami (choć nie wszystkie funkcje są konstruktorami, ale nie będę tego teraz szczegółowo omawiał) oraz w nowej generacji języka mamy klasy (słowo kluczowe class), ale to w dużym uproszczeniu tylko stare mechanizmy owinięte w wygodniejszą i bardziej czytelną składnię.

Ale użyliśmy przypadkowo lub nie dla funkcji określenie instancja. To też sobie wyjaśnimy. W JS większość rzeczy jest obiektami. Funkcje też są obiektami (też mają metody i właściwości, np. name, length, call, apply, bind, ...). Zatem też są instancją jakiejś klasy. Czy funkcja-konstruktor Function coś ci podpowiada?

Kod: Zaznacz cały
var Services = function () {};
Services instanceof Function; // true


Czyli po prostu, w JS funkcje są obiektami, ale na tyle specjalnymi, że można je wywołać, co skutkuje wykonaniem kodu zawartego w ciele funkcji. Gdy korzystamy z definicji funkcji lub wyrażenia funkcyjnego nie mamy w kodzie jawnego użycia new Function, ale wynikiem tych składni i tak jest obiekt-funkcja.

Mam nadzieję, że tobardziej rozjaśni Twoje wątpliwości.
Avatar użytkownikakuku
Rafał Kukawski

+∞
+∞

Posty: 19410
Dołączył(a): 14.04.2002

Re: Niezrozumiałe wykorzystanie prototypu funkcji

Post 05.04.2017, 08:26:12

Zatem wniosek z tego taki, że Services to zarowno funkcja-konstruktor jak i instancja. Jest to o tyle dla mnie "dziwne", że z jednej strony jeżeli na funkcji-konstruktorze przypiszemy właściwości do prototype, to wszystkie instancje będą miały do niej dostęp. Z drugiej strony jest to instancja, więc wywołujemy ją z new.
Nie rozumiem tego tak jak bym chciał niestety, ale bardzo dziękuję za Twoją pomoc Kuku!

pozdrawiam!
whitty
Posty: 79
Dołączył(a): 12.07.2015

Re: Niezrozumiałe wykorzystanie prototypu funkcji

Post 05.04.2017, 10:32:36

Z drugiej strony jest to instancja, więc wywołujemy ją z new.

nie zrozumiałem tego, więc zgaduję, że tutaj leży problem w rozumowaniu.

Kod: Zaznacz cały
var a = new Services();
a instanceof Services; // true


a jest instancją "klasy" Services. Posiada wszystko to co jest zdefiniowane w Services.prototype

Kod: Zaznacz cały
Services instanceof Function

Services jest funkcją. Funkcje w JS są po prostu specjalnymi obiektami (bo można je wywołać), zatem możesz je uznać za instancje "klasy" Function. To znaczy, że Services posiada właściwość .name, metody .call, .apply, .bind, bo takie są zdefiniowane w Function.prototype.

Kod: Zaznacz cały
Function

Function to wbudowana JavaScriptowa funkcja tworząca obiekty, które są funkcjami. Definiuje cechy funkcji w prototype Function.prototype.

Dla uproszczenia swojego życia zignoruj fakt, że funkcje w JS są obiektami. Ważne jest tylko, że używamy operatora new w parze z funkcją, żeby w wyniku dostać obiekt, który posiada cechy zdefiniowane w funkcja.prototype.

Kod: Zaznacz cały
var obj = new funkcja();


Jeśli coś dalej jest niejasne, odezwij się proszę do mnie na Skype (rafael.kukawski). Jestem online o randomowych porach, dlatego możemy przez prywatne wiadomości uzgodnić dzień i godzinę.
Avatar użytkownikakuku
Rafał Kukawski

+∞
+∞

Posty: 19410
Dołączył(a): 14.04.2002

Re: Niezrozumiałe wykorzystanie prototypu funkcji

Post 09.04.2017, 20:06:19

Bardzo Ci dziękuję!

Tak naprawdę została mi jedna rzecz do zrozumienia i to wprowadza u mnie mętlik. Mogę stworzyc nową funkcję-konstruktor poprzez:

Kod: Zaznacz cały
var Services = function() {};


badz:

Kod: Zaznacz cały
function Services () {
};


badz

var Services = new Function();

i pozniej tworzyc nowe obiekty z
Kod: Zaznacz cały
new Services();


Póki co wszystko się zgadza tak?

Czyli mamy konstruktor. Ale mam problem ze zrozumieniem tego o czym wspomniałeś:

Kod: Zaznacz cały
var Services = function () {};
Services instanceof Function; // true


Wychodzi na to, że konstruktor jest instancją..konstruktora?

To ostatnia rzecz o jaką proszę.

Pozdrawiam i dziękuję!
whitty
Posty: 79
Dołączył(a): 12.07.2015

Re: Niezrozumiałe wykorzystanie prototypu funkcji

Post 09.04.2017, 22:05:50

Wychodzi na to, że konstruktor jest instancją..konstruktora?

jakkolwiek zagmatwane to jest, to odpowiedź brzmi "tak", co pokazuje też operator instanceof. Funkcje w JS oprócz tego, że są funkcjami, są też po prostu obiektami. A te w swoim łańcuchu prototypów mają Function.prototype.
Avatar użytkownikakuku
Rafał Kukawski

+∞
+∞

Posty: 19410
Dołączył(a): 14.04.2002

Re: Niezrozumiałe wykorzystanie prototypu funkcji

Post 10.04.2017, 15:01:16

Ok, póki co głębiej nie drążę, po prostu stosuję.

Dziękuję Ci za pomoc, przynajmniej wiem na czym stoję.

Pozdrawiam!
whitty
Posty: 79
Dołączył(a): 12.07.2015


Powrót do JavaScript


 


  • Podobne wątki
    Odpowiedzi
    Wyświetlone
    Ostatni post

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości

Hosting, Domeny, SSL
iCash

Subskrypcja

Mamy 49638 zarejestrowanych użytkowników.
Najnowszy użytkownik: BrendaFi


Nasi użytkownicy napisali:

  • 933825 wiadomości
  • w 245892 tematach

Najnowsze wpisy na blogu

Najnowsze artykuły

Najaktywniejsi (ostatnie 30 dni)