Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JS] konflikt dwóch obiektów
Forum PHP.pl > Forum > Po stronie przeglądarki
Berkovits
Nie jestem profesjonalnym programistą. Byłem całkiem dobry w liceum, ale od tego czasu minęło już ponad 10 lat. Teraz piszę proste gry w przeglądarce dla mojej córki (gdzie więcej zwierzątek, rozpoznanie cyferki, itd.). Prawdę powiedziawszy nie ogarniam tego języka JavaScript, bo nie jest taki klasyczny obiektowy. Ostatnio spotkałem się z takim problemem i nie wiem, co jest grane. Spróbowałem znaleźć najmniejszy kod, który by ukazywał ten problem. Oto on:

  1. function print(t){document.getElementById("info").innerHTML+=t;}
  2.  
  3. function actions()
  4. {
  5. this.list=new Array(); //lista funkcji do wywołania
  6. this.index=0; //indeks aktualnej funkcji do wywołania
  7. }
  8.  
  9. actions.prototype.add = function(funct){
  10. _this = this;
  11. this.list.push(function(){
  12. funct();
  13. _this.doit()
  14. });
  15. }
  16.  
  17. actions.prototype.doit = function()
  18. {
  19. if(this.index>=this.list.length) //koniec listy
  20. {
  21. print(']('+(this.list.length)+')');
  22. return; // koniec listy, a więc koniec roboty.
  23. }
  24. this.list[this.index++](); //uruchom kolejną funkcję z listy
  25. }
  26.  
  27. actions.prototype.do = function(){
  28. print('[');
  29. this.doit();
  30. }
  31.  
  32.  
  33. function a1()
  34. {
  35. print(5);
  36. }
  37.  
  38. function a2()
  39. {
  40. t2 = new actions();
  41. t2.add(function(){print(6);});
  42. t2.add(function(){print(7);});
  43. }
  44.  
  45. function load()
  46. {
  47. t1 = new actions();
  48.  
  49. t1.add(function(){print(1);});
  50. t1.add(function(){print(2);});
  51. t1.add(function(){print(3);});
  52. t1.add(function(){print(4);});
  53. t1.add(a2); //t1.add(a1); (*)
  54. t1.do();
  55. //W przypadku, gdy w (*) jest t1.add(a1), wszystko działa zgodnie z oczekiwaniami.
  56. //W przypadku, gdy w (*) jest t1.add(a2), oczekuję, że
  57. // napisze '[1234', potem stworzy listę dwóch funkcji t2 (ale ich nie wywoła), a następnie napisze '](5)', bo było 5 funkcji na liście.
  58. // On wyświetla [123467](2). Niejako stworzenie listy t2 nadpisuje listę t1, ale nie tyle wstawia wyrazów z t2 do listy t1, bo na końcu lista nie ma długości 7, ale 2, czyli długość t2.
  59. //Dlaczego?
  60. };
  61.  
  62. </head>
  63. <body onload = "load();">
  64. <p>info: <span id="info"></span></p>
  65. </body>
  66. </html>


Problem wstawiłem do komentarza. Domyślam się, że problemem jest ten nieszczęsny _this, który z jednej strony muszę użyć zamiast this, ponieważ przy uruchamianiu funkcji z listy, zmienna this nie musi się odnosić do danego obiektu. Mam wrażenie, że to, że w obu obiektach t1 i t2 jest ta sama nazwa _this powoduje ten konflikt.

Uprzejmie proszę o pomoc, jak uporać się z problemem.
jacobson
Ja moze zapytam o to, co bys chcial osiagnac, poniewaz Twoje rozwiazanie jest dosc "pogmatwane" a swoja droga to jakbys chcial porobic "ciekawsze" gry w prosty sposob to polecam: http://processing.org/
Berkovits
Do jacobson:
Dzięki za odpowiedź.

Chcę mieć klasę, która by uruchamiała w zadanej kolejności funkcje. Tutaj dałem uproszczoną wersję, aby było łatwiej znaleźć błąd. Dla przykładu, chcę uruchomić dźwięk, mówiący ,,Wybierz ", potem, gdy ten się skończy, wyświetla się napis "21", potem uruchamia się dźwięk "dwadzieścia", potem, gdy ten dźwięk się skończy, dźwięk "jeden", a na końcu "kropek". Czyli funkcje, które są wykonywane natychmiastowo (w kodzie dałem tylko te), oraz działające dłużej (dźwięk), na zakończenie których czekają kolejne funkcje. Dodatkowo funkcja po prostu dająca pauzę danej długości. Wszystko mi działało, ale jak zacząłem zagnieżdżać moją klasę w sensie pokazanym na przykładzie, zaczęło się krzaczyć.

Myślałem, by zrobić to przez zdarzenia: zakończenie danej funkcji zgłasza się do obiektu "actions", ale jak widzę, js nie obsługuje własnych zdarzeń do naszych obiektów.

Dzięki za link, zaznajomię się.
trueblue
A jeśli w linii 13 zadeklarujesz _this jako zmienną lokalną (var _this=this), to co wtedy?
Berkovits
Do trueblue:
No dziękuję Ci! Zadziałało w tym programie i tym moim. Siedziałem nad tym już dłuuugo. Kurcze, muszę sobie więcej poczytać o JS, bo jak na razie uczyłem się tylko tyle ile było potrzebne, by napisać jakąś grę.
trueblue
Proszę bardzo.

Do klas i łańcuchów funkcji polecam Ci framework MooTools: http://mootools.net/ http://mootools.net/docs/core/Class/Class.Extras
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.