![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 9 Pomógł: 2 Dołączył: 30.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
Witajcie,
Przy pisaniu skryptu JS natrafiłem na pewien problem związany z rozszerzaniem głównego obiektu Array. Gdy dodam metody w taki sposób
Okaże się że tablica x ma aż 3 elementy, natomiast pętla zwróci zarówno 3 elementy jak i te dwie nowe metody. Czy znacie składnie która pozwoliła by dodawać metody do ciała obiektu, możliwe do wywołania, ale nie widoczne w pętli jako kolejne elementy? Ten post edytował wukkie 10.06.2012, 17:51:02 |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 159 Pomógł: 43 Dołączył: 8.03.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
do tablicy w JavaScripcie (a właściwie do danych w niej) uzyskujemy dostęp poprzez indek, np.: W JS tablica jest również obiektem więc jeśli użyjesz pętli for(var i in a){} to uzyskujesz dostęp nie tylko do danych ale także do pól i metod tego obiektu, tak więc nie da się osiągnąć efektu o który pytasz. Jeśli chcesz wypisać wszystkie elementy z tablicy to musisz użyć pętli w takiej postaci:
Pozdrawiam |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 623 Pomógł: 79 Dołączył: 16.01.2008 Ostrzeżenie: (0%) ![]() ![]() |
Możesz sprawdzać czy typeof x[i]!='function'
Tu masz o typeof: http://www.adp-gmbh.ch/web/js/operators/typeof.html |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 9 Pomógł: 2 Dołączył: 30.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
Jest to oczywiście rozwiązanie, ale zasięg takiej zmiany jest zbyt nieprzewidywalny. Wykorzystanie dowolnego modułu w którym pojawiły by się operacje na elementach tablic były by awaryjne.
Witam, do tablicy w JavaScripcie (a właściwie do danych w niej) uzyskujemy dostęp poprzez indek, np.: W JS tablica jest również obiektem więc jeśli użyjesz pętli for(var i in a){} to uzyskujesz dostęp nie tylko do danych ale także do pól i metod tego obiektu, tak więc nie da się osiągnąć efektu o który pytasz. Jeśli chcesz wypisać wszystkie elementy z tablicy to musisz użyć pętli w takiej postaci:
Pozdrawiam Zgadza się, natomiast problem pojawia sie w przypadku gdy posiadam tablicę asocjacyjną. Tj.
W tym przypadku nie mogę wykorzystać pętli for ( i=0... ). Owszem dostaję dostęp do metod, ale tylko dodanych przeze mnie. Co ciekawe w przypadku gdy posiadam tylko jedną dodaną funkcję w postacie
problem nie występuje. Ten post edytował wukkie 10.06.2012, 18:47:10 |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 159 Pomógł: 43 Dołączył: 8.03.2009 Ostrzeżenie: (0%) ![]() ![]() |
właśnie ... jest przecież metoda hasOwnProperty(nazwa) która sprawdza czy obiekt ma takie pole lub metodę i zwraca true lub false. jeśli dopisujesz metody do głównego obiektu to wystarczy sprawdzić w pętli czy jest to pole/metoda tego obiektu np.:
oczywiście sprawdzenie metody "x" lub "z" które nie są bezpośrednimi metodami obiektu x da wynik false i nie zostaną one wyświetlone. Problem będzie jeśli napiszemy tak: wtedy metoda x staje się bezpośrednią metodą obiektu x i sprawdzenie x.hasOwnProperty("x") da wynik true. Ten post edytował AdIoS_Neo 10.06.2012, 19:34:35 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 9 Pomógł: 2 Dołączył: 30.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
Tak, to rozwiązanie jest podobne do tego z typeof i wymusza dodawanie tego warunku w każdej pętli która znajduje się w skrypcie. Lecz co w przyadku gdy wykorzystuje kod napisany przez innego użytkownika i nie przewidział takiego zachowania podczas wywoływania pętli for..in ?
Być może takie rozwiązanie nie istnieje, lecz jestem ciekaw, ze względu na to że problem występuje dopiero przy dwóch dodadnych metodach. Prędzej zrezygnuje z rozszerzeania głównych obiektów niż sprawie że każda pętla for..in będzie wymagała modyfikacji. ![]() Może macie doświadczenia z takim problemem? |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 159 Pomógł: 43 Dołączył: 8.03.2009 Ostrzeżenie: (0%) ![]() ![]() |
Inaczej tego nie obejdziesz niestety, tak w ogóle w JavaScript nie ma tablic asocjacyjnych jak wcześniej napisałeś, a pętla powinna Ci wypisać także jedną metodę którą dodałeś, jeśli tego nie robi to jest gdzieś błąd.
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 2 350 Pomógł: 512 Dołączył: 4.01.2009 Skąd: Wrocław / Świdnica Ostrzeżenie: (0%) ![]() ![]() |
Bo w praktyce rzadko się używa prototype do obiektów globalnych( Array, HTMLElement, itd. ) - przynajmniej ja tak robię
![]() Używałbym w takim przypadku metody a'la jQuery, czyli tworzenie własnego obiektu i manipulowanie dopiero nim. Czyli w przykładzie jQuery mamy $(...).operacja(); , a nie operacje bezpośrednio na elementach DOM( HTMLElement.prototype.operacja = .... ). Kod var tablica = ....;
mojObiektObslugującyTablice( tablica ).x(); mojObiektObslugującyTablice( tablica ).y(); -------------------- |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 9 Pomógł: 2 Dołączył: 30.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
Inaczej tego nie obejdziesz niestety, tak w ogóle w JavaScript nie ma tablic asocjacyjnych jak wcześniej napisałeś, a pętla powinna Ci wypisać także jedną metodę którą dodałeś, jeśli tego nie robi to jest gdzieś błąd. Faktycznie jest jakaś niespójność i nie wiem skąd się bierze. Przypadek a: localhost - jedna metoda dodana
Rezultat firebug: 0 1 1 2 1,2 Przypadek b: localhost - dwie metody
Rezultat firebug: 0 1 1 2 test function() __proto__ [] constructor [undefined] prototype [] 1,2,function() Przypadek c: http://jsbin.com/acozus/edit#javascript,html,live i tu już wszystko jest jak powinno, czyli odrazu metody sie pojawiają jako elementy w pętli. Na chromie jest podobnie na moim localhoscie. Jakieś pomysły? ![]() Bo w praktyce rzadko się używa prototype do obiektów globalnych( Array, HTMLElement, itd. ) - przynajmniej ja tak robię ![]() Używałbym w takim przypadku metody a'la jQuery, czyli tworzenie własnego obiektu i manipulowanie dopiero nim. Czyli w przykładzie jQuery mamy $(...).operacja(); , a nie operacje bezpośrednio na elementach DOM( HTMLElement.prototype.operacja = .... ). Kod var tablica = ....; mojObiektObslugującyTablice( tablica ).x(); mojObiektObslugującyTablice( tablica ).y(); Zgadza się wszystko, jednak naturalnym miejscem dla metod do manipulacji na samej tablicy, dobrze by był to ten obiekt - biorąc pod uwagę że posiada "wiedzę" potrzebną do wykonania takiego zobowiązania. Po prostu było by to gromadzenie jednego rodzaju operacji w jednej "klasie". Ten post edytował wukkie 10.06.2012, 23:16:40 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 04:24 |