Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Javascript] Tworzenie obiektow
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
Orzeszekk
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.
wookieb
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.
nospor
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.
wookieb
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.
cudny
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.
wookieb
Poza tym przypominam, że w podejściu prototypowym nie da się uzyskać właściwości prywatnych.
nospor
A jak w konstruktorze stworzysz właśność prywatną?
wookieb
http://javascript.crockford.com/private.html
nospor
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.
wookieb
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"?
nospor
Cytat
Nie, w ten sposób tworzysz właściwość publiczną.
wiem 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 smile.gif
wookieb
Dlaczego znów "pseudo dziedziczenie" ?
nospor
Ponieważ zarówno by osiągnąć "prywatność" jaki i dziedziczenie trzeba kombinować 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ć smile.gif
cudny
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ę 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 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 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 wink.gif

Taka dygresja smile.gif ale to chyba za szeroki temat na ten post tongue.gif
nospor
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.
cudny
Tak, są pewne zasady, ale w innych językach też istnieją zasady nie do złamania, np. konstruktor zawsze musi być publiczny 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 wink.gif
Ale na prawdę, tutaj będzie zdań tyle co ludzi tongue.gif bo z jednej strony nie da się w pełni wykorzystać obiektowości bez enkapsulacji tongue.gif
Ja rękawic nie podejmę, można się podknąć na ringu o każą nierówność biggrin.gif
wookieb
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.
Niktoś
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.
nospor
@wookieb to ty przykładem z php próbujesz coś z js przenieść na php. I to nie udolnie 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 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 tongue.gif Przykład z poprzedniego posta bardzo dobrze to pokazuje.

@down: ok smile.gif
wookieb
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.
Niktoś
Dyskusja dotyczyła js,potem kłótnia o zasięg zmiennych prywatnych.Co do tego ma singelton?Już pokazuje:
[CSHARP] pobierz, plaintext
  1. public class Moja_Klasa
  2. {
  3. private string pupa;
  4. public Moja_Klasa(){}
  5.  
  6. public string blada
  7. {
  8. get { return pupa; }
  9. set { pupa = value; }
  10. }
  11.  
  12. }
[CSHARP] pobierz, plaintext

Zmienna prywatna to nie zmienna publiczna,a dostęp do niej i modyfikacja jest znacznie utrudniona.Jak widzisz dostęp do zmiennej prywatnej tylko za pomocą akcesorów-czy to oznacza pseudo prywatność?.Jeśli chodzi o js według mnie to wygląda w ten sposób-JS nie ma zmiennych globalnych,prywatnych,ale można to emulować tak jak to Nospor pokazał,dlatego według mnie można to spokojnie nazwać pseudo.
Wookieb, jak to nabicie posta to powiedz-to pousuwam swoje wszystkie 650 postów.
nospor
Cytat
Jak widzisz dostęp do zmiennej prywatnej tylko za pomocą akcesorów
Akcesory to akcesory. Normalny mechanizm.
Ale jak ma się do tego singleton to i ja nadal nie wiem smile.gif
Niktoś
Żywcem ze strony ms.
[CSHARP] pobierz, plaintext
  1. public sealed class Singleton
  2. {
  3. private static readonly Singleton instance = new Singleton();
  4.  
  5. private Singleton(){}
  6.  
  7. public static Singleton Instance
  8. {
  9. get
  10. {
  11. return instance;
  12. }
  13. }
  14. }
[CSHARP] pobierz, plaintext

Do zwracania instancji także użyty został akcesor-zwracana jest instancja.Nie widzisz podobieństwa?
nospor
Równie dobrze można było użyć metody getInstance().
Równie dobrze można było użyć akcesora.
Super, ale jak to się ma do tematu? Fakt, temat ogólnie zboczył z toru na inny, ale twoja wstawka to zboczenie z toru na polną drogę, z torami nie mającą nic wspólnego wink.gif

@down
Cytat
.I jest różnica między private a public
Dziękujemy za wyjaśnienie. Od lat się zastanawiałem po co stosować public albo private a tu patrz... jest różnica..... wink.gif
Niktoś
No zboczył z toru na temat zakresu zmiennych prywatnych.U mnie to wszystko fajnie widać właśnie na takich klasach.I jest różnica między private a public.Jeśli chodzi o js tak jak wyżej.
Ja ten temat kontynuować nie bedę,bo chyba nie o to chodziło autorowi.
cudny
Cytat(Niktoś @ 21.03.2012, 12:02:59 ) *
No zboczył z toru na temat zakresu zmiennych prywatnych.U mnie to wszystko fajnie widać właśnie na takich klasach.I jest różnica między private a public.Jeśli chodzi o js tak jak wyżej.
Ja ten temat kontynuować nie bedę,bo chyba nie o to chodziło autorowi.


Wiem Niktoś, wyglądam jak prześladowca, aż zacząłem się z tego teraz śmiać pod nosem biggrin.gif ale... temat czy rozpoczęty, czy w trakcie dyskusji nie ma praktycznie nic wspólnego z twoim postem (znowu biggrin.gif ).
Chodzi o obiektowość samego javascriptu, a enkapsulacja to tylko jeden z argumentów dyskusji wink.gif
Niktoś
Cytat
Wiem Niktoś, wyglądam jak prześladowca.

Nawet po avatarze to widać tongue.gif
wszerad
Ja się przyzwyczaiłem, że prototype używam tylko kiedy potrzebuje rozrzeżyć funkcjonalność konstruktora do którego nie mam bezpośredniego dostępu:
  1. window.HTMLElement.prototype.$$ = function(){
  2. return this.querySelectorAll.apply(this,arguments);
  3. }

W innym wypadku konstruktor zawsze mozna zmienić więc prototypów nie używam bo jest to nieprzejrzyste.
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.