Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [JavaScript] zmienne klasowe "protected" w javascript
--adrian--
post
Post #1





Goście







Witam
W taki sposob realizuje dziedziczenie w javascripcie:
  1. var KlasaPochodna=function()
  2. {
  3. var tempBazowa=new KlasaBazowa();
  4. for (property in tempBazowa)
  5. {
  6. this[property] = tempBazowa[property];
  7. }
  8.  
  9. ...
  10. }

Niestety w ten sposob przekazywane sa tylko funkcje i zmienne "publiczne". Moje pytanie jest czy da sie w jakis sposob dziedziczyc z klasy bazowej zmienne i metody "prywatne"(tj. w innych jezykach "protected")? z góry dziekuje za wszystkie odpowiedzi
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
stefan33
post
Post #2





Grupa: Zarejestrowani
Postów: 49
Pomógł: 4
Dołączył: 22.07.2012

Ostrzeżenie: (0%)
-----


No wiesz mi chodzilo o zmienna prywatna majaca byc protected, ciezko to nazywac w js w którym takie rzeczy nie sa jawnie wyszczególnione. Co do pamieci to mam poki co wolna reke bo pisze dla siebie wiec nie zamierzam sie przejmowac (IMG:style_emoticons/default/tongue.gif) Niby czasami kapsulkowanie sztuka dla sztuki, ale mimo wszystko wedlugo mnie to dobra praktyka, bo z kolei idac w druga strone i pomijajac kapsulkowanie kiedy sie podoba mozna w koncu sie przejechac lekko

Zrobie wlasnie tak jak mowisz- poki co odpuszczam sobie tworzenie jakichs super poprawnych klas i m.in. prywatne beda sie zaczynaly od "_" i git (IMG:style_emoticons/default/biggrin.gif) Dzieki za wstepny kod jakos bede sobie kombinowal zeby to wszystko mi hulalo (IMG:style_emoticons/default/wink.gif)

Mysle ze to co napisales jest zrozumiale, wiec dziekuje bardzo za kolejne rady, jestem mega zdziwiony ze chcialo Ci sie tyle pisac (IMG:style_emoticons/default/tongue.gif) Tak wlasnie zrobie, tzn. bede po prostu pisal swoj kod a z czasem na pewno ogarne sobie jak wszystko powinno byc. Do tej pory mialem napisane proste klasy w ktorych nie wykorzystywalem dziedziczenia i zdawalo mi sie ze znam obiektowy js, stad zalozylem temat zeby szybko sie dowiedziec jak zrobic "protected" i nagle sie okazuje ze prawie nic nie wiem (IMG:style_emoticons/default/tongue.gif) ale teraz juz mam na to o wiele lepszy widok, myslalem, ze w js bedzie sie dalo wszystko imitowac czarno na bialym jak w c++ czy javie, ale tak nie bedzie. Co do zmiennych protected to natknalem sie na taki artykul wiec widac, ze js to ciezki kawalek chleba: http://code42.pl/2010/12/19/obiektowy-java...wietego-graala/

Dzieki jeszcze raz za pomoc,w razie czego bede pisal, ale mam nadzieje, ze juz sobie bede radzic (IMG:style_emoticons/default/tongue.gif)

Chociaz w sumie jakies male pytanko zawsze sie znajdzie (IMG:style_emoticons/default/smile.gif) Naprawde jeszcze raz dziekuje za pomoc, jezeli nie ma Pan juz czasu to nie ma problemu prosze nie odpisywac (IMG:style_emoticons/default/tongue.gif)


Czy takie bindowania sa poprawne? Czy jakies jest lepsze/gorsze, czy po prostu uzywac sobie zaleznie od potrzeb? Z gory dziekuje za odpowiedz (IMG:style_emoticons/default/smile.gif)
  1. var jakasKlasa=function()
  2. {
  3. var divEl=document.createElement('div');
  4.  
  5. //wypelnianie diva elementami html
  6.  
  7. var divPrzycisk=divEl.firstChild.firstChild;
  8.  
  9.  
  10.  
  11. //1-sza wersja:
  12.  
  13. var jakasFunkcja=function()
  14. {
  15. //kod
  16. }
  17.  
  18. divPrzycisk.onclick=function() { jakasFunkcja(); }
  19.  
  20.  
  21. //2-ga wersja:
  22.  
  23. this.jakasFunkcja=function()
  24. {
  25. //kod
  26. }
  27.  
  28.  
  29. (function(przekazanaFunkcja)
  30. {
  31. divPrzycisk.onclick=function() { przekazanaFunkcja(); }
  32. }
  33. )(this.jakasFunkcja);
  34. }

Go to the top of the page
+Quote Post
zegarek84
post
Post #3





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


Cytat(stefan33 @ 13.09.2012, 09:31:20 ) *
Co do zmiennych protected to natknalem sie na taki artykul wiec widac, ze js to ciezki kawalek chleba: http://code42.pl/2010/12/19/obiektowy-java...wietego-graala/

Chyba nawet ja to kiedyś czytałem ;p - ale jak już wspomniałem i rozwinąłem to co ja i większość rozumie pod "protected" to jak ktoś będzie chciał tą zmienną zrównać z ziemią to to zrobi choćby specjalnie dziedzicząc... więc jak już wspomniałem raczej w granicach zdrowego rozsądku sama notacja tutaj powinna wystarczyć, a resztę jeśli fragment programu musisz udostępnić bez możliwości naruszenia kodu, to całość kapsułkujesz i udostępniasz główny interfejs, a jak inny programista bezpiecznie coś chce zmieniać to widzi na co zwracać uwagę jeśli to nie jest zakapsułkowane...
Cytat(stefan33 @ 13.09.2012, 09:31:20 ) *
Czy takie bindowania sa poprawne? Czy jakies jest lepsze/gorsze, czy po prostu uzywac sobie zaleznie od potrzeb?

oba są poprawne więc wątek rozwinę na inne tory... ale wcześniej napomnę, iż minus podpinania zdarzeń "onload" i im podobnych bezpośrednio to maksymalnie jeden listener (obiekt|funkcja nasłuchująca) do elementu, lepszy by był tutaj addEventListener (IE chyba attachEvent), a rozwiązanie uniwersalne w bibliotekach np. jQuery to po prostu .bind lub aliasy pewnych przypadków bezpośredniego wywołania jak .click...

miałem zejść na inne tory, więc a propo pierwszego skoro użyłeś nazwy "jakasKlasa" chciałbym wspomnieć, iż ostatnio zwłaszcza w świecie PHP modne stało się określenie Dependy Injection (jakoś tak się pisze ;p) - widzę, że raczej jesteś w temacie to się nie rozpisuję ;p - coby klasy niby były bardziej uniwersalne... ale tu ja tego nie piszę w kierunku, że jest źle, wszystko zależy od kontekstu i należy rozróżniać programowanie strukturalne od programowania obiektowego i od programowania zorientowanego obiektowo ;p (nie chce mi się przytaczać pewnych regułek ale OOP najbardziej charakterystyczne jest dla javy choć i tam można myśleć strukturalnie), co do bindowania wspomniałem wyżej a i jeszcze temat bindowania rozwinę...

druga technika zwłaszcza dotycząca kapsułkowania przez (function(){})() jest przydatna w celu skapsułkowania (ukrycia dostępu przed resztą programu) fragmetu kodu lub w celu przekazania zmiennej (bądź referencji do obiektu) którą chce się podpiąć pod bindowaną funkcję, gdzie dana zmienna zmienia swoją wartość choć mogła by być dostępna w skope bindowanej funkcji... akurat w Twoim fragmencie kodu nie potrzebnie robiłeś przypisywania funkcji anonimowej podczas, gdy ona nic nie robiła, zamiast:
divPrzycisk.onclick=function() { przekazanaFunkcja(); }
wystarczyło napisać:
divPrzycisk.onclick=przekazanaFunkcja;
lub:
divPrzycisk.onclick=this.jakasFunkcja;
i tutaj znowu zboczę z tematu choć tamten jeszcze pociągnę... jeśli na stronie jest mnóstwo elementów i przypisujesz mnóstwo listenerów tych samych to dużego narzutu pamięci nie będzie gdyż przypisujesz referencję do tej samej funkcji | obiektu różnym obiektom, jednak to nie jest zalecane przy bindowaniu powiedzmy setek (zapomnij o liczbach, to przykład, nie jestem programista i nie na wszystkie testy mam czas) tych samych elementów (np. duuuuża tabelka i wiele wierszy), to bardziej optymalna będzie technika zaimplementowana w metodzie z jQuery która dawniej nazywała się .live (ale nasłuchiwała na całym dokumencie chyba pod "body") a teraz jest już dostępne .delegate - na czym to polega, bindujesz najniższego rodzica (wspólny element) i sprawdzasz kliknięcia dla dzieci, pomijasz bindowanie tysięcy elementów (co może zająć czas) a dodatkowo masz nasłuch na elementu dodane do danego drzewa znacznie później np. przez AJAX, tą technikę zrozumiesz jak zrozumiesz propagację zdarzeń w drzewie DOM i będziesz umiał wtedy to sam implementować w natywnym JavaScript (choć może czasem wystarczy wiedza jak to działa, po co tworzyć koło od nowa ^^)...

ale sam ten zapis z drugiej metody bardziej mi się kojarzy z przekazywaniem argumentów, gdzie np. podpinałeś do wielu elementów podobną funkcję a chciałeś wywołać dodatkowo jakąś metodę, czyli to co pokazałeś ale zrobić coś więcej... i tu głupi przykład jak z Twoim bindem samo zapamiętanie który to element bindowany w pętli (bez tego z referencji pamiętało by ostatnią iterację)
for(i = 0; i<100; ++i) // np niżej to kolekcja elementów
divPrzycisk[i].onclick=(function(i_wartosc){return function(){jakasFunkcja(i_wartosc);}})(i);
gdzie "jakasFunkcja" jest w skope widoczności, ale zwracam uwagę, iż do kolejnego elementu przypisywana jest nowa anonimowa funkcja i jest zapamiętywany stan zmiennej "i" - często ta technika przydaje się też przy korzystaniu z setTimeout(...) (oczywiście bez niejawnego evala ;p), gdzie to co napisałem wyglądało prawie jak to co Ty napisałeś z tą różnicą, iż w efekcie skrócenia można było z tym samym skutkiem zapisać divPrzycisk.onclick=this.jakasFunkcja;

ps. dawniej jak poznawałem JS to trochę przeglądałem kod biblioteki Prototype [nie pamiętam kto wspomniał, iż tam kod jest samo dokumentujący się] (kod był i raczej dalej jest czytelnie napisany - choćby z tego względu warto choć na 5 min rzucić okiem ;]), wtedy w jQuery była jedna większa sieczka, teraz jest duuużo lepiej jak pamiętam z przed roku i w sumie jQuery to chyba najlepsza minimalistyczna biblioteka do JS, a plusem jest implementacja biblioteki Sizzle do wyszukiwania elementów po CSS (nowe przeglądarki w czystym js to .querySelector) i kilka przydatnych tricków jak .delegate (dawniej coś podobnego na własną rękę implementowałem w czystym JS)

sorki, że się rozpisałem, ale znowu dziś świętowałem w granicach zdrowego rozsądku a mam co świętować ^^, jutro jadę odebrać żonkę i córunię (fajnie mała poskrzekuje ^^ - a mamusi już dziś w nocy dała się w kość ^^

pozdro ;]
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.12.2025 - 14:30