Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [JavaScript]przestrzeń nazw jak ją ugryźć ?
marcus753
post
Post #1





Grupa: Zarejestrowani
Postów: 281
Pomógł: 3
Dołączył: 8.06.2009
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Witajcie,
próbuję opanować przestrzeń nazw w javascripcie i mam z nią mały problem a mianowicie:

  1. var testowaStrona = {
  2. obiekt1: {
  3. funkcja1 : function () {
  4. alert("funkcja11");
  5. var myVar = setInterval(function(){this.funkcja2("blabla")},1000);
  6. },
  7. funkcja2 : function (tekst) {
  8. alert("funkcja12"+tekst);
  9. }
  10. },
  11. obiekt2: {
  12. funkcja1 : function (imie,nazwisko,adres) {
  13. this.imie=imie;
  14. this.nazwisko=nazwisko;
  15. var adres=adres;
  16. },
  17. funkcja2 : function () {
  18. alert(this.funkcja1.imie);
  19. alert(this.funkcja1.adres);
  20. }
  21. },
  22. }
  23. testowaStrona.obiekt1.funkcja1();
  24. testowaStrona.obiekt2.funkcja1("marcin","marcinowski","wawa");
  25. testowaStrona.obiekt2.funkcja2();


Mamy sobie kod, na dole wywołuje funkcje obiektu1 funkcja1, wszystko jest ok do póki nie chce przypisać funkcji2 do set interval wywala error że nie ma takiej funkcji, co ciekawe jeśli w samej funkcji wstawie np. this.funkcja2() ładnie mi tą funkcje otworzy. Jak zatem utworzyć interval dla funkcji 2 ? wiem że można pisac pełen adres: testowaStrona.obiekt1.funkcja2(); ale to bez sensu, nie da się jakoś łatwiej ?

I drugie pytanie: Mamy obiek 2 oraz dwie funkcje w pierwszej chciałbym przypisać kilka parametrów a w drugiej te parametry odczytać, jak mogę to zrobić ? na razie nie mam dostępu ani do imienia ani do adresu.

Pozdrawiam i dziękuję za pomoc.

Ten post edytował marcus753 15.04.2014, 19:51:27


--------------------
Cokolwiek zostanie upuszczone na uklad elektroniczny, spadnie zawsze tam gdzie wyrzadzi najwiecej szkody.
Go to the top of the page
+Quote Post
gr56
post
Post #2





Grupa: Zarejestrowani
Postów: 77
Pomógł: 15
Dołączył: 19.11.2011

Ostrzeżenie: (0%)
-----


1. W kontekście funkcji, this nie odnosi się już do obiektu tylko do samej funkcji. Można zachować odniesienie do obiektu przypisując wartość this do innej zmiennej np
Kod
var that = this;

Natomiast jeśli nie chcesz przekazywać żadnych parametrów do wywoływanej funkcji to możesz zrobić po prostu tak:
Kod
setInterval(this.funkcja2, 1000);


2. W tym wypadku this odnosi sie do obiekt2 tak wiec mozesz odczytac zmienne uzywajac this.imie, this.nazwisko
Go to the top of the page
+Quote Post
PrinceOfPersia
post
Post #3





Grupa: Zarejestrowani
Postów: 717
Pomógł: 120
Dołączył: 18.04.2009

Ostrzeżenie: (0%)
-----


Kod
      funkcja1 : function () {
         alert("funkcja11");
         var myVar = setInterval(function(){this.funkcja2("blabla")},1000);
      },



o ile w większości języków this oznacza instancję klasy, to w JavaScripcie zmienna "this" jest dynamiczna i ustalana przy każdym wywołaniu funkcji.
(np. przy różnego rodzaju zdarzeniach myszy zazwyczaj zmienna this wskazuje na obiekt (np. dany <div>) ,w którym zostało wywołane zdarzenie)
I ponieważ tworzysz funkcję anonimową
Kod
function(){this.funkcja2("blabla")}

to jeśli ta funkcja zostanie odpalona, to w środku tej funkcji this będzie już czym innym, niż na zewnątrz funkcji. (Nie pamiętam już czy będzie null, czy obiektem window, czy jeszcze czym innym)

Można to obejść "zapamiętując" zmienną this:
Kod

funkcja1 : function () {
    var self = this;
     alert("funkcja11");
     var myVar = setInterval(function(){self.funkcja2("blabla")},1000);
},


Natomiast oczywiście jeśli masz zmienną obiektu i wywołujesz ją po kropce, czyli np. testowaStrona.obiekt2.funkcja2();, to z automatu zmienna this wskazuje na obiekt2. Dlatego można pomyśleć na początku, że JS to normalny język wink.gif

Problem w tym, że to działa tylko jak od razu wywołujesz funkcję. Jeśli zrobiłbyś tak setInterval(testowaStrona.obiekt2.funkcja2, 1000); to nie zadziała, ponieważ wtedy podajesz jako argument samą funkcję, setInterval widzi tylko obiekt funkcji (funkcja jest obiektem), a nie widzi, do którego obiektu funkcja należy (czyli co "pierwotnie" było this).

Na dodatek można manipulować zmienną this przy wywoływaniu funkcji, służą do tego metody call i apply. Tak możesz wywołać metodę obiektu2, ale podmienić jej zmienną this, żeby this == obiekt1
Kod
testowaStrona.obiekt2.funkcja2.call(obiekt1);


Oraz za pomocą metody bind można "wiązać" funkcję do konkretnego obiektu, np:
Kod
var  kot =  {
    jak_robi: 'miau, miau',
    funkcja: function() {
        alert(this.jak_robi);
    }
};
setTimeout(kot.funkcja.bind(kot), 700);

tym sposobem "przywiążesz" funkcję do konkretnego obiektu kot.
można nawet wiązać parametry, dzięki czemu można robić skróty:
Kod
setTimeout(alert.bind(null, 'hello world'), 1000);

zamiast pisać tak:

Kod
setTimeout(function() {
    alert('hello world');
}, 1000);


Ten post edytował PrinceOfPersia 15.04.2014, 22:54:49


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 02:03