Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript] zmienne klasowe "protected" w javascript
Forum PHP.pl > Forum > Przedszkole
-adrian-
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
zegarek84
javascript na innej zasadzie ma obiektowowość - poczytaj o javascript prototype (nie o bibliotece Prototype), wszystkie metody i zmienne są publiczne, da się zrobić prywatne ale szkoda się rozpisywać jeśli nie rozumiesz zasięgu zmiennych...
poczytaj na stronie mozilli:
Details of the object model
JavaScript from John Resig Learning
http://bonsaiden.github.com/JavaScript-Garden/

zrozum działanie metod .apply i .call, zrozum closures (zasięg zmiennych) w JS a polubisz ten język, bez problemu będziesz mógł tworzyć chronione metody, podmieniać je we wszystkich obiektach na raz w trakcie działania kodu... zrozum działanie takich funkcji jak (function(zmienna){})(wartosc);

mógłbym dać więcej linków ale to nie ma sensu - w pierw zrozum to powyższe a będziesz rozumiał jak jest rozwiązane OOP w JavaScript...
stefan33
Dziekuje bardzo za odpowiedz(wczesniej nie bylem na swoim komputerze dlatego pisalem z goscia i niestety nie moge dac "pomógł"). W obiektowości javascript całkowicie zielony nie jestem, aczkolwiek na pewno bardzo początkujący. Linki z pewnoscia przerobie do konca, aczkolwiek jako, ze nie lubie teorii na sucho to mam pytanie czy dobrze kombinuje. Wydaje mi sie ze o wiele lepsze do dziedziczenia bylyby metody apply i call np.
  1. var KlasaPochodna=function()
  2. {
  3. KlasaBazowa.call(this,arg1,arg2);
  4. }

Czy ten sposob dziedziczenia jest poprawny w javascript? Z gory dziekuje za odpowiedz
droslaw
Funkcje call/apply to jeden ze sposobów na dziedziczenie w js. Przydaje się w tedy kiedy chcesz wywołać konstruktor klasy nadrzędnej zamiast polegać tylko na prototypie. Obiekty stworzone wten sposób działają szybciej, ale potrzebują trochę więcej pamięci.
Mi najbardziej przeszkadza, to że dala call/apply nie zawsze działa instanceof np.:
Kod
object instanceof Child; // true
object instanceof Parent // false.

Przy prototypowaniu trzeba uważać też na pola prywatne, jeśli dziedziczyśz w taki sposób:
Kod
Child.prototype = new Parent();

wszystkie obiekty Child będą mięć te same wartości pól prywatnych dziedziczonych z Parent, co się nie zdarzy prze drugiej metodzie.
stefan33
Dziekuje za odpowiedz i potwierdzenie, no tak trzeba bedzie pamietac ze instanceof nie dziala. Jak dla mnie dziedziczenie przez prototypowanie jest troszke bezuzyteczne skoro nie dziedzieczy sie wtedy pol prywatnych
droslaw
Pola prywatne się dzieczyczy ale ze względu na to, że wszystkie obiekty potomne naję ten sam obiekt prototype, nie nadasz im różnych wartości dla różnych obiektów. Chyba, że tworzyłbyś dla każdego obiektu potomnego nowy obiekt rodzica i przypisywał do prototypu ale to nie byłoby dobre wyjście.
stefan33
Moglbys jasniej napisac co masz na mysli? Mi chodzilo o cos takiego i wydaje sie dzialac dobrze.. :
  1. var KlasaBazowa=function()
  2. {
  3. var pole="domyslnaWartosc";
  4.  
  5. this.setPole=function(newPole)
  6. {
  7. pole=newPole;
  8. }
  9.  
  10. this.getPole=function()
  11. {
  12. return pole;
  13. }
  14. }
  15.  
  16.  
  17. var KlasaPochodna=function()
  18. {
  19. KlasaBazowa.call(this);
  20. }
  21.  
  22.  
  23. var klasaPochodna1=new KlasaPochodna();
  24. var klasaPochodna2=new KlasaPochodna();
  25.  
  26.  
  27. klasaPochodna1.setPole("zmienionaWartosc");
  28.  
  29. alert(klasaPochodna1.getPole()); //zmienionaWartosc
  30. alert(klasaPochodna2.getPole()); //domyslnaWartosc
droslaw
Ja pisałem o dziedziczeniu przez prototype. Jeśli dziedziczysz przez call, to działa tak jak w Twoim przykładzie.
A co się stanie jeśli dziedziczysz przez prototyp:
Kod
function Parent(){
    var field;
    this.setField = function(value){
        field = value;
    };
    this.getField = function(){
        return field;
    };
}
        
function Child(){
    
}
Child.prototype = new Parent();

child1 = new Child();
child2 = new Child();
child1.setField(1); // w child1 przypisuję 1 do field
alert(child2.getField()); // w child2 też jest 1
child2.setField(2); //w child2 przypisuję 2 do field
alert(child1.getField()); // w child1 też jest 2

przykład
zegarek84
RANY JULEK ;/ - ALEŻ CI ZACZĘLI MIESZAĆ ;/

metody apply i call służą do wywołania funkcji/metody w kontekście danego obiektu, w kontekście danego obiektu to znaczy, że this w ciele metody/funkcji wskazuje na konkretny obiekt/kontekst... js jest mocno dynamiczny...

idąc dalej zaraz na skróty wytłumaczę o co chodzi z tym .prototype - ale wolałbym, byś przeczytał to co w linkach gdyż nie chce mi się za dużo pisać...

właśnie kożystając z prototypowania jest mniejszy narzut pamięci gdyż funkcja jest zapisywana raz w prototypie, obrazowo załużmy, że dziadek w prototypie ma zdefiniowaną metodę .cos

Kod
function Dziadek(zmienne){}
Dziadek.prototype.cos = function{}//blabla

var jestem_dziadzia = new Dziadek();
jestem_dziadzia.cos(); // wywołane w kontekście obiektu jestem_dziadzia metoda Dziadek.prototype.cos()

// rodzice i wnuki - pominmy... wnuk odrazu dziedziczy z dziadzi

function Wnuk(){}

Wnuk.prototype = new Dziadek();

var wnuk = new Wnuk();
wnuk.cos();// wywołane w kontekście obiektu wnuk metoda Dziadek.prototype.cos()

function Prawnuk(){}

// dziedziczmy dalej wszystkie metody i zmieńmy to "cos"
Prawnuk.prototype = new Wnuk;
Prawnuk.prototype.cos = function(){}

var prawnuczek = new Prawnuk;
prawnuczek.cos(); // wywołane Prawnuczek.prototype.cos() w kontekście obiektu prawnuczek


metody są szukane w górę po łańcuchu prototypów

dodatkowo odpal se w konsoli i przeanalizuj przykładowy kod który coś Ci powinien dać do myślenia:
Kod
function Test(a){this.a = a}
Test.prototype = {a:3};
var t1 = new Test(9);
console.log(t1.a);
delete t1.a;
console.log(t1.a);
t1.a = 11;
console.log(t1.a);
delete t1.a;
console.log(t1.a);

na wyjściu otrzymasz:
9
3
11
3

dodatkowo w trakcie możesz zmieniać wartość prototypów to puki coś w żywym obiekcie nie nadpiszesz to to też się zmieni, więc dynamicznie możesz manipulować zachowaniem rzeszy obiektów (wystarczy być kreatywnym, np. +50% obrony dla podobnych odzziałów) - luknij na podobny kod:
Kod
function Test(){}
Test.prototype = {a:3};
var t1 = new Test(), t2 = new Test();
t1.a=1; t2.a=2;
console.log(t1.a, t2.a);
delete t1.a; delete t2.a;
console.log(t1.a, t2.a);
Test.prototype.a = 4;
console.log(t1.a, t2.a);
delete Test.prototype.a;
console.log(t1.a, t2.a);

na wyjściu otrzymasz:
1 2
3 3
4 4
undefined undefined

pisane z palca i nie estetycznie gdyż na szybko... kontekst obiektu dla metod można też przypisując jak w prototype dla metod i czasem tak się też robi, tu apply i call ładniej wyglądają...

i jeśli chcesz wywołać konstruktora rodzica w konstruktorze dziecka to kożystasz z apply/call lub metodę w innym kontekście

funktion Potomna(zmienna1, zmienna2, zmienna3){
this.bleble = zmienna3;
//na reszcie zmiennych zrobić to co rodzic
Rodzic.call(this, zmienna2, zmienna1);
}

dodatkowo w JS często przy toworzeniu instancji prototypu chce się czasem pominąć domyślny konstruktor by nie robił nadmiarowo lub nie ustawial pewnych rzeczy za wczasu - w podanych linkach znajdziesz na to sposób i jesli chcesz go wywołąć w konstruktorze "klasy" (bo nie ma klas, są prototypy obiektów) to kożystasz z call lub apply

PRZECZYTAJ PODANE LINKI, POBAW SIĘ Z KODEM I KONSOLĄ I WRAZIE PYTAŃ WRÓĆ I JE ZADAJ
ale to co powyżej napisali to mnie rozbawiło ;]

sorki za niesformatowany kod i niestety jeśli chodzi o rzeczy związane z informatyką to ANGIELSKI niestety ;] (ja go znam tylko biernie, rozumiem tekst pisany i kto co mówi - sporo filmów ^^) ale sam mówić po ang. nie umiem ;p [chyba, że "kali chcieć jeść ^^"]

ps. instanceof działa ;]
stefan33
Dziekuje bardzo za odpowiedzi smile.gif Wydaje mi sie ze wszystkie przeslania zrozumialem pewnie jeszcze bede wracal do tego tematu poczytac w przyszlosci biggrin.gif Nie pozostaje nic tylko ogarniac coraz wiecej i wiecej tongue.gif
Co do angielskiego to wiem cos o tym tongue.gif mozna jako tako wszystko czytac, ale jak rodowity angol cos mowi to nie rozumiec ani slowa tongue.gif


edit:
A mialbym jeszcze takie pytanie: nie istnieje mozliwosc zebym mogl operowac bezposrednio na odziedziczonej zmiennej prywatnej? Dla przykladu:
  1. var KlasaBazowa=function()
  2. {
  3. var pole="domyslnaWartosc";
  4.  
  5. this.setPole=function(newPole)
  6. {
  7. pole=newPole;
  8. }
  9.  
  10. this.getPole=function()
  11. {
  12. return pole;
  13. }
  14. }
  15.  
  16.  
  17. var KlasaPochodna=function()
  18. {
  19. KlasaBazowa.call(this);
  20.  
  21. alert(pole); // nie dziala, fajnie by bylo gdyby dzialalo
  22. alert(this.getPole()); // dziala
  23. }

Bo tak to w sumie bez sensu, jesli musze tworzyc dla kazdej zmiennej prywatnej publiczny get i set aby mozna bylo sie do niej odwolywac w klasie podrzednej, to rownie dobrze moge ja uczynic publiczna..
zegarek84
Cytat(stefan33 @ 11.09.2012, 10:10:00 ) *
A mialbym jeszcze takie pytanie: nie istnieje mozliwosc zebym mogl operowac bezposrednio na odziedziczonej zmiennej prywatnej?
...
Bo tak to w sumie bez sensu, jesli musze tworzyc dla kazdej zmiennej prywatnej publiczny get i set aby mozna bylo sie do niej odwolywac w klasie podrzednej, to rownie dobrze moge ja uczynic publiczna..

Jeśli programowałeś w jakimkolwiek języku, przeczytaj jeszcze raz a zauważysz, że z tym pytaniem lekko się zagalopowałeś - lekko ponieważ wiem o co Ci chodzi, jednak... zmienna prywatna zawsze ma pozostać jako zmienna prywatna w kontekście danej klasy, klasy czyli szkieletu obiektu, tutaj nie ma klas ale z kolei są "prototypy"... w JS zmienne prywatne z najmniejszym narzutem są te zachowujące się jak statyczne (widzę, że powinieneś wiedzieć jak je zaimplementować skoro umiałeś zrobić zwykłe zmienne prywatne z getterem i setterem...), większy już próbując tworzyć co instancję nowe zmienne gdzie często trzeba jakiś getter i setter gdyż niestety choć funkcja niemal ta sama, to co instancję obiektu tworzysz nowa funkcję w pamięci... (przeczytaj całość...)...

że tak powiem, troszku wypiłem i zastanawia mnie też, dlaczego jakiś programista nie podjął dyskusji, ale skoro trochę mam czasu spróbuję napisać to co wiem...

na języki programowania należy patrzeć jak na narzędzia, jedne są lepsze do pewnych rzeczy, inne są lesze do innych...

zanim przejdę do właściwej wypowiedzi chciałbym nadmienić, iż np. Bjarne Stroustrup (związany z językiem C++) uważa, iż stratą czasu jest tworzenie często niepotrzebnej otoczki getterów i setterów - i w zasadzie tu z nim się zgodzę, gdyż widzę jak wielu stosuje kapsułkowanie jako sztuka tylko dla sztuki - fakt, że czasami to niezbędne ale nie popadajmy ze skrajności w skrajność...

jak już wspomniałeś i zauważyłeś niby nie warto tak pisać i dalej napiszę niby gdyż ;p... no właśnie gdyż, i tu chcę się odwołać do hasła "notacja węgierska" - nie trzeba jej całej stosować ale przynajmniej zasada zmiennych prywatnych zaczynających się od podkreślnika bywa przydatna w takich językach jak JS ale... skoro te zmienne są "prywatne" a są publiczne gdzie każdy je może nadpisać to jakie są - są zmiennymi chronionymi (protected) o które pytałeś się w temacie (jak niby chronione jak nie chronione ;p), a no a chronione to są na jakiej zasadzie ;p? dziedziczysz to możesz z nimi robić co zechcesz (niby nie ma do nich dostępu z zewnątrz ale zawsze można dorzucić kolejną warstwę - dla chcącego nic trudnego ^^)... i uwierz mi, tu sama notacja na protected wystarczy, a na zmienne prywatne zwykłe z var... tworzysz szkielet aplikacji i nie obce jest Ci kapsułkowanie?? nie problem, zrób w deseń:
(function(window, document){
// tu porób sobie co tam chcesz z wykorzystaniem zasięgów zmiennych, porób obiekty itd tak by nic nie wyciekło na zewnątrz, zbinduj zdarzenia do drzewa DOM i masz wszystko hermetyczne i stosowanie pewnych zasad wystarczy... lub w tej funkcji anonimowej zwróć pewien interfejs, obiekt do aplikacji gdzie zewnętrzny programista resztę może bezpiecznie modyfikować, a co nie może to jest ukryte, zresztą co tak naprawdę znaczy bezpiecznie modyfikowaćquestionmark.gif
})(window, document);

sorki za ten tekst który pewnie trudno zrozumieć (nie wiem czy był sens próba przekazania swoich spostrzeżeń), popisz trochę w JS z wykorzystaniem różnych technik, poczytaj trochę... jeśli poznasz JS i zaznajomisz się z techniką programowania zdarzeniowego to sam powinieneś stwierdzić, iż w zasadzie masz wszystko co trzeba... są tez mini biblioteki symulujące pisanie na klasach ale to wszystko nie potrzebne, przyrównał bym to do kogoś kto próbuje poznać jQuery nie znając JS, a potem nie może dana osoba zrozumieć o co chodzi, gdzie i co znaczy this w kodzie itd...

jak masz jakieś pytania jeszcze to sprecyzuj je jeszcze jakoś inaczej a spróbuję podzielić się spostrzeżeniami, dobrze by było, gdyby jeszcze jakiś programista się wypowiedział ;p - nie jestem programistą z zawodu (choć przez pewien czas w ten sposób dorabiałem i teraz ostatnio robię magisterkę z infy bez wysiłku a równolegle zrobiłem różnice programowe gdyż jakoś jednak programowanie trochu mnie interesuje)

pozdro
stefan33
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 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 biggrin.gif Dzieki za wstepny kod jakos bede sobie kombinowal zeby to wszystko mi hulalo wink.gif

Mysle ze to co napisales jest zrozumiale, wiec dziekuje bardzo za kolejne rady, jestem mega zdziwiony ze chcialo Ci sie tyle pisac 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 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 tongue.gif

Chociaz w sumie jakies male pytanko zawsze sie znajdzie smile.gif Naprawde jeszcze raz dziekuje za pomoc, jezeli nie ma Pan juz czasu to nie ma problemu prosze nie odpisywac 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 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. }

zegarek84
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 ;]
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.