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, 17: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: 76
Dołączył(a): 12.07.2015

Re: Niezrozumiałe wykorzystanie prototypu funkcji

Post 20.03.2017, 09: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: 19324
Dołączył(a): 14.04.2002

Re: Niezrozumiałe wykorzystanie prototypu funkcji

Post 20.03.2017, 20: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: 76
Dołączył(a): 12.07.2015

Re: Niezrozumiałe wykorzystanie prototypu funkcji

Post 20.03.2017, 22: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: 19324
Dołączył(a): 14.04.2002

Re: Niezrozumiałe wykorzystanie prototypu funkcji

Post 21.03.2017, 18: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: 76
Dołączył(a): 12.07.2015

Re: Niezrozumiałe wykorzystanie prototypu funkcji

Post 21.03.2017, 19: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: 19324
Dołączył(a): 14.04.2002


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 6 gości

Hosting, Domeny, SSL
iCash

Subskrypcja

Mamy 49378 zarejestrowanych użytkowników.
Najnowszy użytkownik: wojciech-opiniologia


Nasi użytkownicy napisali:

  • 933259 wiadomości
  • w 245687 tematach

Najnowsze wpisy na blogu

Najnowsze artykuły

Najaktywniejsi (ostatnie 30 dni)