![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 53 Pomógł: 1 Dołączył: 28.09.2007 Skąd: Gdynia Ostrzeżenie: (0%) ![]() ![]() |
Zrobiłem sobie klasę AJAX, będącą zestawem narzędzi i mającą jakieśtam swoje właściwości (do konfiguracji). Utworzyłem ją jako zwykły obiekt, będący zmienną globalną mniej więcej tak:
Kod var AJAX = { property1 : null, property2 : null, method1 : function() { ... } } Odwołuję się do niej prosto: AJAX.method1(); . Komodo Edit daje prawidłowe podpowiedzi do właściwości i metod. Co więcej, w środku utworzyłem więcej modułów JSON, tak że mogę odwoływać się do nich per AJAX.module1.method1(). Wszystko pięknie. Prawie dokładny odpowiednik klasy statycznej w PHP. Nawet lepiej, bo to klasa która może zawierać inne klasy. Moduł składający się z modułów. Git. W takim razie po co używać singletonów? Co one mogą, czego nie może moduł JSON? Zrobiłem pełną edycję poprzedniego posta, bo nikt chyba nie złapał o co mi w ogóle chodzi. Ten post edytował pp-layouts 1.12.2009, 00:23:12 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 53 Pomógł: 1 Dołączył: 28.09.2007 Skąd: Gdynia Ostrzeżenie: (0%) ![]() ![]() |
Proszę, wytłumacz dokładniej, w jaki sposób klasa statyczna zajmuje więcej miejsca w pamięci. Czy kod metod niestatycznych nie zużywa miejsca w pamięci jeśli nie są użyte? Czyli jak, dopiero zaczynają używać miejsce po pierwszym użyciu?
A propos Twojego pierwszego posta, to pewnie wina przykładu, zbyt abstrakcyjny, może gdybyś zapodał na czymś bardziej konkretnym. Nie rozumiem też, co ma w ogóle JSON (a właściwie object literal, bo JSON wymaga, żeby nazwy właściwości pisać z użyciem cudzysłowów) do "this". This-a można używać odnosząc się do wnętrza literala (namespace-a), a można do instancji klasy, zależnie od kontekstu. To czy zapiszę klasę w formie funkcji, czy zapiszę ją jako obiekt OL - cóż, wydaje mi się, że to tylko kwestia zapisu, nie ma to chyba żadnych innych implikacji, bo próbowałem na dużych klasach tych 2 sposobów zapisu zamiennie i wydawały się działać dokładnie identycznie. Przy zapisie w OL może wystąpić niejednoznaczność "this". Ale tylko w przypadku kiedy nie przypisuje się bezpośrednio obiektu do prototypu. Wtedy w kontekście OL będzie oznaczać namespace, a w kontekście instancji tą instancję. Co do metod i zmiennych prywatnych - to znów wydaje mi się sztuką dla sztuki, bo z tego co wiem, JavaScript tego po prostu nie obsługuje, ale można to wymusić - kosztem skomplikowania kodu. I znów z tego co wiem, dostępność zmiennych i metod ogranicza się dla ułatwienia życia, stąd umyka mi sens tej operacji. (Poza może very very defensive programming). Bo jeśli chodzi o ułatwienie życia developerom, to o wiele prostszy i wygodniejszy jest JSDoc, gdzie można opisać sobie klasy i dostępność keywordami takimi jak @class, @public, @private, @final itede. Jak znajdę trochę czasu wolnego, muszę zrobić kiedyś trochę benchmarków różnych rozwiązań - zobaczymy w praktyce co jest szybsze i o ile. Jak już mówimy o szybkości, zastanawia mnie też, czemu wszędzie używa się if (typeof(zmienna) == 'undefined') zamiast if (zmienna === undefined). Pierwsze wydaje mi się dużo wolniejsze, bo wymaga porównania napisów, a drugie odpala super szybką funkcję systemową, zbliżoną strukturalnie do isNan(). Wiem, że można złośliwie przypisać do undefined jakąś wartość, ale znów pojawia się pytanie - po co? Dalej, jQuery używa lokalnych definicji undefined, które są === undefined. Czytałem, że to przyspiesza kod, ale czy na tyle znacząco, żeby używać tego poza frameworkiem? I czy aby jest to jeszcze aktualne dla nowych silników JS? (FF3.5, O10, Chrome 3) |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 332 Pomógł: 294 Dołączył: 12.10.2008 Skąd: Olkusz Ostrzeżenie: (0%) ![]() ![]() |
Jak już mówimy o szybkości, zastanawia mnie też, czemu wszędzie używa się if (typeof(zmienna) == 'undefined') zamiast if (zmienna === undefined). Pierwsze wydaje mi się dużo wolniejsze, bo wymaga porównania napisów, a drugie odpala super szybką funkcję systemową, zbliżoną strukturalnie do isNan(). Wiem, że można złośliwie przypisać do undefined jakąś wartość, ale znów pojawia się pytanie - po co? to nie chodzi o przypisanie wartości - jak w temacie do którego podałem link zauważyłeś to jestem bardziej hobbistą ale... na szybko sprawdziłem i stwierdzam - musiałbyś mieś pewność, że ta zmienna została jakoś zdefiniowana przynajmniej, czy jakoś zainicjowana gdzieś - i nie mam na myśli wartości - szybko to sprawdziłem w pasku adresu wpisując: java script:if(a === undefined)alert('fffffff');void(0); //to nie działa a to zadziała: java script:var a; if(a === undefined)alert('ffff');void(0); //to działa podczas gdy typeof zadziała także dla nie zainicjowanych zmiennych - jeśli odpowiednio jest kod napisany można zrezygnować z typeof, już przy samej definicji funkcji function cos(a,(IMG:style_emoticons/default/cool.gif) {...} jakby inicjujemy te zmienne (choćby nie przypisując wartości) Dalej, jQuery używa lokalnych definicji undefined, które są === undefined. Czytałem, że to przyspiesza kod, ale czy na tyle znacząco, żeby używać tego poza frameworkiem? I czy aby jest to jeszcze aktualne dla nowych silników JS? (FF3.5, O10, Chrome 3) zanim w prost wyjaśnię napiszę co innego - js jest bardzo mocno obiektowy, mocniej niż nie jednemu się wdaje (dawniej sam tego nie wiedziałem), a to, że jest inny (i niby łatwy, bo do prostych rzeczy jest łatwy), oraz to, że inaczej definiuje się obiekty niż "normalnie" wielu wprowadza w błąd... i dalej to pasowało by na to o co pytasz spojrzeć patrząc na zasięg zmiennych w js - w php od tak do zewnętrznych zmiennych nie ma zasięgu... i teraz czy w js warto "buforować" odwołanie do obiektu bądź zmienną(IMG:style_emoticons/default/questionmark.gif) samo undefined o którym piszesz jest w obiekcie window - szukając zmiennych funkcja w pierw sprawdza czy jest ona zdefiniowana lokalnie - nie ma jej to idzie w górę (sam wiesz, że obiekty można zagnieżdżać - funkcje w js też - i teraz tak przechodzi przez wszystkie obiekty aż do ostatniego gdzie jest zdefiniowana zmienna w ostatnim obiekcie window (obiekcie globalnym - no może nie do końca - nie chcę tutaj polemizować ;p).... alo znowu zboczyłem z tematu - a czy słusznie - może i tak... jeśli tylko raz coś sprawdzasz, do czegoś wewnątrz tylko raz się odwołujesz to nie warto, lecz jeśli wewnątrz masz pętlę i tych porównań jest wiele to warto, lub jeśli danej metody często używasz to możesz tą zmienną zbuforować bliżej jej zasięgu.... - to jest tak jak z odwołaniami do elementu DOM - przecież w pętli nie będziesz co chwila szukał elementu przez document.getElementsByTagName('bleble')[0] - skoro zawsze używasz tego samego obiektu bądź jego wartości, podobnie count w php powinno się obliczyć na początku, żeby nie liczyło co każde sprawdzenie warunku... ale główny temat był o singleton ;p Proszę, wytłumacz dokładniej, w jaki sposób klasa statyczna zajmuje więcej miejsca w pamięci. Czy kod metod niestatycznych nie zużywa miejsca w pamięci jeśli nie są użyte? Czyli jak, dopiero zaczynają używać miejsce po pierwszym użyciu? z tego co mi wiadomo pamięć jest przydzielona od razu by dana metoda, funkcja mogły zostać użyte w każdym momencie a nie dopiero po pierwszym użyciu, metody statyczne i zmienne są wszędzie także w zasięgu - ja bym to przyrównał (ale w duuużym skrócie i ogólnikowo - czyli to nie jest to samo!!!) raczej trochu do stosu i sterty znanego z c++, przy czym pierwsze jest niby szybsze, ale z tym z kolei nie można przesadzać... poza tym na te pytania jakie zadajesz w js zaciekawi Cię kilka filmików (no nie wszystkie ale kilka jest tam ciekawych): http://developer.yahoo.com/yui/theater/ |
|
|
![]() ![]() |
![]() |
Aktualny czas: 3.10.2025 - 19:18 |