użycie this we funkcji

użycie this we funkcji
KO
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 10 lat
  • Postów:114
0

używać this we funkcjach nie można, ja wymyśliłem taki sposób, aby przed funkcją utworzyć zmienną globalną i do niej przypisać this czyli v=this; mam pytanie czy jest jakiś optymalniejszy sposób?

edytowany 1x, ostatnio: madmike
Demonical Monk
  • Rejestracja:ponad 17 lat
  • Ostatnio:11 miesięcy
0

Nie możesz $this używać, jeśli funkcja nie należy do żadnej klasy :O

Kopiuj
class CosDziwnego {
protected function aaa() {
   echo('lol!');
}

public function bbb() {
   $this->aaa();
}
}

$klasa = new CosDziwnego();
$klasa->bbb();

Wynik:
lol!

PS. I nie "we funkcji", tylko "w funkcji"!


Women were the reason I became a monk - and, ah, the reason I switched back...
edytowany 2x, ostatnio: Demonical Monk
KO
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 10 lat
  • Postów:114
0

Sorry, zapomniałem napisać, że to się tyczy Java script'u :P

Mam klasę do obsługi ajax'a przypisuje XMLHttpRequest() do this.request, ale nie mogę tego użyć onreadystatechange bo to inny obiekt :P

Kopiuj
        this.request = new XMLHttpRequest();
	this.onSuccess = obj.onSuccess;
	ajax = this;
	this.request.onreadystatechange = function ()
	{
		if(ajax.request.readyState == 4)
		{
			ajax.onSuccess(ajax.request.responseText);
  	}
	}

Było w webmasterce ale madmike przeniósł do php -_-

edytowany 2x, ostatnio: konrados
Demonical Monk
To po jakiego grzyba dział PHP?
Demonical Monk
O, już widzę że madmike przeniósł. 12 sekund szybciej ^^
madmike
bo wypadałoby jednak opisać przynajmniej w tagach... do webmastering trafia zazwyczaj wszysko, łącznie z php :]
BS
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 12 lat
0
konrados napisał(a)

używać this we funkcjach nie można,

Nieprawda. Można. JS udostępnia spore możliwości używania i manipulowania this wewnątrz funkcji.

Napisz precyzyjnie co chcesz osiągnąć. Oprócz opisu dorzuć przykład. W komentarzu napisz, gdzie i na co ma this wskazywać.

KO
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 10 lat
  • Postów:114
0

w wyższym poście opisałem :P, i wiem o tym, że można, lecz źle się wyraziłem :P powinienem napisać we funkcjach innego obiektu :D

Jeszcze dopisze, że klasa zrobiona za pomocą przestrzeni nazw

edytowany 3x, ostatnio: konrados
BS
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 12 lat
0

@konrados:
Opisałeś po kolejnych edycjach. Ale zrobiłeś to niegramatycznie -- co to znaczy "Mam klasę do obsługi ajax'a przypisuje XMLHttpRequest() do this.request"? Nie rozumiem o co Ci chodzi. Na serio, nie zgrywam się. Potem też zjadłeś jakieś słowo... Napisz posta porządnie. Podejrzewam, że mógłbym Ci bez żadnych problemów pomóc jeśli rozumiałbym w czym rzecz.

KO
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 10 lat
  • Postów:114
0

Wiesz co to klasa ? Wiesz na czym polega obsługa ajaxa? To co mam ci opisać ?

Ps: sorry, spieszyłem się bo musiałem wyjść na chwilę i nie zauważyłem że nie wszystko w jednym poście dałem.

Więc chodzi o to że mam klasę do obsługi ajaxa i chce w funkcji onreadystatechange zrobić sprawdzenie czy ready == 4 no obiekt xmlhttprequest jest przypisany do zmiennej request ale tą zmienna jest polem klasy ajax. I teraz żeby to przekazać muszę zrobić globalna ajax = this; i w onreadystatechange robić ajax.request.ready i się pytam czy da się to zrobić optymalniej

edytowany 1x, ostatnio: konrados
BS
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 12 lat
0

Ja wiem -- jestem st. specjalistą ds. rozwoju aplikacji i specjalizuję się w JavaScripcie właśnie, więc wręcz muszę wiedzieć ;)

Być może jednak Ty sam nie wiesz jak do końca z tym jest.

W wersji JavaScriptu, którą zapewne stosujesz, tak naprawdę nie ma klasycznego dziedziczenia. Nie ma prawdziwych "klas". Są obiekty: obiekty mogą dziedziczyć po innych obiektach, ale niezupełnie po "klasach". W JavaScripcie istnieje dziedziczenie prototypowe oraz coś, co nazywamy czasem dziedziczeniem funkcyjnym, co jest dość szerokim pojęciem obejmującym m.in. tzw. dziedziczenie pasożytnicze.

To jednak tutaj prawdopodobnie nie ma żadnego znaczenia. Nie potrzeba klas, by w JavaScripcie używać i ustawiać this -- wystarczą funkcje. Prosiłem Cię, żebyś napisał, w którym miejscu chciałbyś, żeby this na coś wskazywało i na co ma ono wskazywać (na jaki obiekt). Nigdzie tego nie napisałeś.

edit: teraz edytowałeś posta, ale ja muszę iść od kompa, więc nie zdążę nawet tej edycji przeczytać :P.

edytowany 2x, ostatnio: bswierczynski
RF
  • Rejestracja:prawie 16 lat
  • Ostatnio:około 10 lat
1

Myślę że funkcja bind zaspokoi twoje potrzeby:

Kopiuj
 
        this.request = new XMLHttpRequest();
        this.onSuccess = obj.onSuccess;
        this.request.onreadystatechange = function ()
        {
                if(this.request.readyState == 4)
                {
                        this.onSuccess(this.request.responseText);
          }
        }.bind(this);

Z tym że nie zawsze jest dostępna także najlepiej jak napiszesz jeszcze cos takiego:

Kopiuj
 
if (!('bind' in Function.prototype)) Function.prototype.bind = function(obj) {itd ... }

da da da daaa
BS
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 12 lat
1

O ile zrozumiałem, to robisz to dobrze. Tyle tylko, że zmienną ajax musisz zadeklarowąć za pomocą instrukcji var, czyli zmienić linijkę:

Kopiuj
ajax = this;

na:

Kopiuj
var ajax = this;

To jest mega, mega ważne. Jeśli pominiesz var, to zamiast zmiennej lokalnej będziesz miał zmienną globalną -- w dodatku jedną dla wszystkich obiektów Twojej "klasy" Ajax. Jak dodasz var, to każdy obiekt klasy Ajax będzie miał swoją kopię zmiennej ajax i będzie to działało.

Możesz też wykonać sztuczkę z funkcją bind, może nawet byłoby to troszkę lepsze rozwiązanie, ale bind rzeczywiście nie jest dostępna we wszystkich przeglądarkach -- to funkcja z ECMAScriptu 5. Nad rozszerzaniem obiektów wbudowanych, tak jak to proponuje @RFabianski, trzeba się jednak 8x zastanowić. Choć IMO w przypadku funkcji bind można to od biedy zrobić warunkowo.

Przykładowa implementacja bind jest dostępna na MDC:
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind

Osobiście najczęściej używam sposobu podobnego do tego, który Ty zastosowałeś, pamiętając o var. Istnieje dość popularna konwencja, żeby taką zmienną przechowującą this nazwać that, choć osobiście się jej nie trzymam -- "zmiennym prywatnym" w "klasach" nadaję nazwy rozpoczynające się od znaku podkreślenia (np. _foo), więc this przechowuję po prostu w zmiennej _this.

edytowany 1x, ostatnio: bswierczynski
Marooned
U nas piszemy var self = this; ;-) choć ostatnio używamy po prostu nazwy głównego obiektu używanego przy enkapsulacji.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.