![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 260 Pomógł: 14 Dołączył: 8.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
Witam. Które podejscie jest poprawne (wydajniejsze i bardziej uznane)?
konstruktory?
czy prototypy?
skladniowo podobaja mi sie bardziej konstruktory. Z prototypow nie korzystalem nigdy jakos odpychają mnie, podoba mi sie to ze mam w konstruktorze zamkniete w jednej funkcji cos na ksztalt klasy (cale bebechy w konstruktorze). Slyszalem ze prototypy sa sporo wydajniejsze stad moje zainteresowanie nimi. |
|
|
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Przy prototypach tracisz pełną wydajność (przeszukiwanie łańcucha prototypów) - przy wrzucaniu metod w konstruktorze o ile dobrze kojarzę tracisz pamięć (ale to trzeba sprawdzić).
Podejrzewam, że ten drugi argument może (podkreślam "może") być zbity z tego względu, że to co teraz robią z silnikami JS to magia, magia i jeszcze raz magia. W większości przypadków mój argument jest jednak słuszny ponieważ każda funkcja musi pamiętać swój własny kontekst utworzenia i zmiennych w nim istniejących. http://www.blog.highub.com/javascript/java...r-vs-prototype/ -> Potwierdza, że tworzenie metod w konstruktorze = więcej zużytej pamięci.
Powód edycji: [wookieb]:
|
|
|
![]()
Post
#3
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
A ja tam nigdy nie patrzyłem na pamięc. Ja używam prototype bo dla mi osobiście bardziej to pasuje, kod dla mnie wydaje się czytelniejszy.
Pozatym używając prototype możemy rozszerzać daną klasę w dowolnym miejscu. Ma to zastosowanie w pewnych sytuacjach. |
|
|
![]()
Post
#4
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
W konstruktorze również.
Pamięć jest ważna. GC dla JS jest nieubłagane. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 387 Pomógł: 66 Dołączył: 31.03.2005 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
Moim skromnym zdaniem prototypy są częściej wykorzystywane, a co do wydajności to spada ale nie w każdym wypadku:
Cytat Wydajność Czas wyszukiwania właściwości, które są na końcu łańcucha prototypów może mieć negatywny wpływ na wydajność krytycznych części kodu. Dodatkowo, próba dostępu do nieistniejącej właściwości zawsze spowoduje przeszukanie całego łańcucha prototypów. Również podczas iteracji po właściwościach obiektu każda właściwość, która znajduje się w łańcuchu prototypów (niezależnie na jakim znajduje się poziomie) zostanie wyliczona." Źródło: http://bonsaiden.github.com/JavaScript-Garden/pl/ Poczytaj w powyższym linku, bardzo fajnie wszytko opisane. |
|
|
![]()
Post
#6
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Poza tym przypominam, że w podejściu prototypowym nie da się uzyskać właściwości prywatnych.
|
|
|
![]()
Post
#7
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
A jak w konstruktorze stworzysz właśność prywatną?
|
|
|
![]()
Post
#8
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
|
|
|
![]()
Post
#9
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Jest to pseudo private moim zdaniem. Jakby było pełne private danego obiektu to by było: this. secret. A oni używają poprostu secret, czyli defacto korzystają z zasięgu zmiennych.
Czyli tak, constructor pozwala na definiowanie pseudo prywatnych właściwości. |
|
|
![]()
Post
#10
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Nie, w ten sposób tworzysz właściwość publiczną. To, że tak się dzieje w innych językach wcale nie oznacza, że identycznie ma się dziać w js.
To co czytasz wyżej to pełna realizacja właściwości prywatnej. Jest przypisana do jednego konkretnego obiektu i niedostępna dla innych. Gdzie tu jest miejsce na "pseudo"? |
|
|
![]()
Post
#11
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat Nie, w ten sposób tworzysz właściwość publiczną. wiem (IMG:style_emoticons/default/smile.gif) Cytat - jest przypisana do konkretnego obiektu Jak dla mnie jest to wynikiem zasięgu zmiennych stąd nazwa pseudo. Ogólnie obiektówka w js dla to wielkie "pseudo". I jeśli można z zasięgu zmiennej zrobić właściwość prywatną to super i hiper. Nie mam nic do tego.- dostępna tylko i wyłącznie obiektu posiadającego tą właściwość Tak samo jak nie mam nic do pseudo dziedziczenia w js (IMG:style_emoticons/default/smile.gif) |
|
|
![]()
Post
#12
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Dlaczego znów "pseudo dziedziczenie" ?
|
|
|
![]()
Post
#13
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Ponieważ zarówno by osiągnąć "prywatność" jaki i dziedziczenie trzeba kombinować (IMG:style_emoticons/default/smile.gif) Fakt, są to opisane metody, ale moim zdaniem jest to kombinowanie. Używam tych metod i jest mi z tym dobrze. Nie zmienia to faktu, iż uważam to nadal za "pseudo" i nie widzę powodu by dalej się o to kłócić (IMG:style_emoticons/default/smile.gif)
|
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 387 Pomógł: 66 Dołączył: 31.03.2005 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
Cytat Ogólnie obiektówka w js dla to wielkie "pseudo" Cytat Gdzie tu jest miejsce na "pseudo"? Tak na szybkiego zanim napiszę to coś wytłumaczę (IMG:style_emoticons/default/tongue.gif) Zawsze jak widzę, że Nospor coś napisał na forum to czytam post, lubię jego posty, a mój syn zawsze patrzy na kubusia puchatka (IMG:style_emoticons/default/biggrin.gif) ale nie mogę się zgodzić co do pseudo obiektowości javascriptu, pseudo jest ale enkapsulacja, sama obiektowość w javascript moim zdaniem jest pełna (IMG:style_emoticons/default/wink.gif) enkapsulacja to tylko jeden niewielki składnik obiektowości. Równie dobrze można powiedzieć, że w C++ jest pseudo obiektowość bo nie ma tak pięknie obiektowej składni jak java i można pisać strukturki (IMG:style_emoticons/default/wink.gif) Taka dygresja (IMG:style_emoticons/default/smile.gif) ale to chyba za szeroki temat na ten post (IMG:style_emoticons/default/tongue.gif) |
|
|
![]()
Post
#15
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
rękawica podniesiona.....
A więc zajmijmy się pseudo na przykładzie "właściwości prywatnych". Kod function test(){ var secret; } Mamy tutaj funkcję test a w niej zmienną lokalną o nazwie secret. Wystarczy, że zrobimy new Kod function test(){ var secret; } o = new test(); And magic..... zmienna lokalną zmienia się we "właściwość prywatną"... No dobra. Skoro mamy już tę wspaniałą "właściwość prywatną" znaczy, że jest ona dostępna dla wszystkich metod danej klasy. No to jedziem dalej z koksem: Kod function test(){ var secret; } test.prototype.bu = function(){ alert(secret); //przecieź secret jest "właściwością prywatną" klasy test, więc jest dostępna i w metodzie klasy test } o = new test(); o.bu();//ZONK!!!! Kto mi teraz wyjaśni czemu moja "właśćiwość prywatna" nie zadziałała? Pewnie powiecie, że przecież nie trzymałem się przepisu i nie tworzyłem tego wszystkiego w konstruktorze. Tak, to prawda. Nie trzymałem się przepisu. ALe gdyby to nie było pseudo to by działało jak ma działać, dla każdej metody klasy test niezależnie jak ją tworzyłem. Wniosek: to jest pseudo. A "właściwości prywatne" udało się osiągnąć dzięki efektowi ubocznemu zasięgu zmiennych. I żeby to stosować to trzeba się trzymać ściśle określonego schematu Cytat ale nie mogę się zgodzić co do pseudo obiektowości javascriptu, pseudo jest ale enkapsulacja, Ale ja nie twierdzę, że w js nie da się pisać obiektowo. Da się. I sam tak często piszę przy dużych projektach. Ale znam ograniczenia js w tej materii. I wiem, że niektóre rzeczy są pseudo, robione na około przy wykorzystaniu rożnych zachowań js.
|
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 387 Pomógł: 66 Dołączył: 31.03.2005 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
Tak, są pewne zasady, ale w innych językach też istnieją zasady nie do złamania, np. konstruktor zawsze musi być publiczny (IMG:style_emoticons/default/wink.gif)
Ale całkowicie się z tobą zgadzam, z tym że tak jak napisałem - javascript ma problemy z enkapsulacją, na którą po prostu są pewne sposoby, jak napisałeś, ale dzięki pseudo enkapsulacji sama obiektowość javascript jest w pełni obiektowa (IMG:style_emoticons/default/wink.gif) Ale na prawdę, tutaj będzie zdań tyle co ludzi (IMG:style_emoticons/default/tongue.gif) bo z jednej strony nie da się w pełni wykorzystać obiektowości bez enkapsulacji (IMG:style_emoticons/default/tongue.gif) Ja rękawic nie podejmę, można się podknąć na ringu o każą nierówność (IMG:style_emoticons/default/biggrin.gif) |
|
|
![]()
Post
#17
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Zacznijmy od tego, że do co teraz robisz to rozszerzasz obiekt o dodatkowe metody w czasie wykonywania programu (runtime).
W dodatku wrzucasz metodą do innej "warstwy" obiektu (czytaj prototyp) co w przypadku PHP mogłoby oznaczać np coś takiego.
Więc co... w php też mamy pseudo zmienne prywatne, które uzyskujemy "tylko" dlatego, że zdefiniowaliśmy je bezpośrednio w klamrach klasy? Pamiętaj, że JS to prototypowy język funkcyjny więc rządzi się zasadami tego języka. Co prawda odmiennymi niż w innych językach ale to wcale nie znaczy, że są złe. Nospor - próbujesz narzucić przyzwyczajenia z innych języków do JS. Każdy język się różni dlatego jest i tak wiele. Każdy ma swoje przeznaczenie, swoich fanów, swoich wrogów. Przeczytaj bardzo dobrą książkę http://pragprog.com/book/btlang/seven-lang...-in-seven-weeks , która otwiera umysł na "zmiany", inne spojrzenie a nie konserwatyzm. |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 1 195 Pomógł: 109 Dołączył: 3.11.2011 Ostrzeżenie: (10%) ![]() ![]() |
Dostęp do zmiennej prywatnej owszem ,ale już jej modyfikowanie już chyba nie.
Cytat return $o->_variable="test1"; Czy to zadziała? Ja u siebie często używam w singeltonie prywatnych zmiennych do ustawiania zmiennych środowiskowych. |
|
|
![]()
Post
#19
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
@wookieb to ty przykładem z php próbujesz coś z js przenieść na php. I to nie udolnie (IMG:style_emoticons/default/wink.gif)
W moim kodzie js nie operowałem na obiekcie tylko prototype używałem na definicji funkcji/klasy. Ty w php dodajesz metody do obiektu (IMG:style_emoticons/default/smile.gif) Cytat Nospor - próbujesz narzucić przyzwyczajenia z innych języków do JS. Każdy język się różni dlatego jest i tak wiele. Każdy ma swoje przeznaczenie, swoich fanów, swoich wrogów. Źle mnie zrozumiałeś. Ja jestem fanem js. Odkąd go poznałem lepiej to się w nim zakochałem. Ale mam swoje zdanie i uważam, że parę rzeczy zrobili naokoło. Bo kiedyś o tym nie pomyśleli, ale się okazało, że nagle by się przydało. I wymyślają przepisy jak zrobić daną rzecz przy wykorzystaniu już istniejących. I takim właśnie przykładem są "właściwośći prywatne". Koniec kropka, nie przekonasz mnie w żaden sposób a już tym bardziej nie tekstem że jestem konserwatywny i nie mogę spojrzeć szerzej.... Co ma piernik do wiatraka? Patrze szerzej, rozumiem, że w js robi się inaczej pewne rzeczy, ale mam chyba prawo powiedzieć, że jest to pseudo. Bo jest (IMG:style_emoticons/default/tongue.gif) Przykład z poprzedniego posta bardzo dobrze to pokazuje.@down: ok (IMG:style_emoticons/default/smile.gif)
Powód edycji: [nospor]:
|
|
|
![]()
Post
#20
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Niktoś - po raz kolejny bezsensownie nabijasz posty. To co mówisz o singletonie ma jakikolwiek związek z tematem?
Nie - więc przystopuj troszkę ze Swoimi komentarzami. @UP - skończmy tą dyskusję na tym etapie.
Powód edycji: [wookieb]:
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 12:51 |