Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [Javascript] Tworzenie obiektow, prototypami czy konstruktorem
Orzeszekk
post
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?
  1. function HidingTextOnInput(inputId, inputCaptionToShow) {
  2.  
  3. this.inputId = inputId;
  4. this.inputCaptionToShow = inputCaptionToShow;
  5. this.controlWasClicked = false;
  6.  
  7. this.getInputControl= function ()
  8. {
  9. return $("#" + this.inputId);
  10. }
  11.  
  12. this.setControlInitialText=function()
  13. {
  14. this.getInputControl().val(this.inputCaptionToShow);
  15. this.controlWasClicked=false;
  16. }
  17.  
  18. this.onBlur = function ()
  19. {
  20. if (this.getInputControl().val() == "")
  21. {
  22. this.setControlInitialText();
  23. }
  24. }
  25. }


czy prototypy?
  1. function newObject()
  2. {
  3. }
  4.  
  5. newObject.prototype.doCostam = function ()
  6. {
  7. }
  8.  
  9. newObject.prototype.doWow = function()
  10. {
  11. }
  12.  
  13. newObject.prototype.constructor = newObject()
  14. {
  15. }


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.
Go to the top of the page
+Quote Post
wookieb
post
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]:
Go to the top of the page
+Quote Post
nospor
post
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.
Go to the top of the page
+Quote Post
wookieb
post
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ż.
[JAVASCRIPT] pobierz, plaintext
  1. function C1 () {
  2. this.metoda1 = function() {
  3. alert('cos');
  4. }
  5. }
  6.  
  7. function C2 () {
  8. C1.call(this);
  9. this.metoda2 = function() {
  10. alert('cos2');
  11. }
  12. }
  13.  
  14. var o = new C2;
  15. o.metoda1();
[JAVASCRIPT] pobierz, plaintext


Pamięć jest ważna. GC dla JS jest nieubłagane.
Go to the top of the page
+Quote Post
cudny
post
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.
Go to the top of the page
+Quote Post
wookieb
post
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.
Go to the top of the page
+Quote Post
nospor
post
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ą?
Go to the top of the page
+Quote Post
wookieb
post
Post #8





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




http://javascript.crockford.com/private.html
Go to the top of the page
+Quote Post
nospor
post
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.
Go to the top of the page
+Quote Post
wookieb
post
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"?
Go to the top of the page
+Quote Post
nospor
post
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
- dostępna tylko i wyłącznie obiektu posiadającego tą właściwość
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.
Tak samo jak nie mam nic do pseudo dziedziczenia w js (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
wookieb
post
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" ?
Go to the top of the page
+Quote Post
nospor
post
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)
Go to the top of the page
+Quote Post
cudny
post
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)
Go to the top of the page
+Quote Post
nospor
post
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.
Go to the top of the page
+Quote Post
cudny
post
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)
Go to the top of the page
+Quote Post
wookieb
post
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.
  1. class test {
  2. private $_variable = 'test';
  3. private $_callbacks = array();
  4.  
  5. public function addCallback($function, Closure $closure) {
  6. $this->_callbacks[$function] = $closure;
  7. }
  8.  
  9. public function __call($method, $args) {
  10. return call_user_func_array($this->_callbacks[$method], $args);
  11. }
  12. }
  13.  
  14. $o = new test();
  15. $o->addCallback('testowa', function() use ($o){
  16. return $o->_variable;
  17. });
  18.  
  19. echo $o->testowa();

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.
Go to the top of the page
+Quote Post
Niktoś
post
Post #18





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


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.
Go to the top of the page
+Quote Post
nospor
post
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]:
Go to the top of the page
+Quote Post
wookieb
post
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]:
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 22.08.2025 - 12:51