Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: JavaScript OOP - zmienne i metody prywatne
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
nywojtas
Mam pytanie, jak mogę w js uzyskać dostęp do metod i zmiennych prywatnych. Jeżeli zmienną "zmienna3" próbuje wyświetlić w metodzie którą utworzyłem w konstruktorze to działa poprawnie, ale metoda prywatna już nie działa.

Jeśli tworzę metodę przez prototype to "zmienna3" jest niezdefiniowana.

Jak można uzyskać dostęp do tej zmiennej i metody priv?

Dzięki za pomoc

Kod
function Test(zmienna, zmienna2) {
    var zmienna3 = 3;
    this.zmienna = zmienna;
    this.zmienna2 = zmienna2;
    
    this.metoda = function() {
      alert(zmienna3);
      priv();
    };
    
    var priv = function() {
        alert(this.zmienna2);
    };
}

Test.prototype.metoda2 = function() {
    alert(this.zmienna);
    alert(zmienna3);
};

var obj = new Test(1, 2);
obj.metoda();
obj.metoda2();
lukasz1985
Sposób tworzenia "metod i pól prywatnych" jest nieco inny od tego co zaprezentowałeś.
http://javascript.crockford.com/private.html
Wymaga to dobrej znajomości JS.
Generalnie ta praktyka jest rzadko stosowana ponieważ zmniejsza czytelność kodu. Lepiej jest stosować standardy nazewnictwa do oznaczania prywatnych metod i pól (na przykład używając przedrostka "_").

Innym dobrym rozwiązaniem jest biblioteka OOP, na przykład:
https://github.com/tnhu/jsface
zegarek84
chyba rypnąłeś się w kodzie gdyż... patrząc na to co chyba chciałeś osiągnąć to this.zmienna i this.zmienna2 są publiczne, prywatna jest zmienna3 oraz metoda priv... ale jeśli chodzi o zużycie pamięci (którym w sumie można się nie przejmować) i szybkość działania zwłaszcza jeśli obiekt króciutko używasz a tworzysz ich wiele to lepiej zapisywać zmienne prywatne przez konwencje... całą aplikację możesz zamknąć do modułu i z niego udostępnić dopiero metody prywatne jeśli na stronie są zewnętrzne skrypty i chcesz ograniczyć dostęp lub by nie było kolizji zmiennych w funkcjach anonimowych i w nich zwracać interfejs = (function(window, undefined){... return {};})(window)... a propo modułowości i wygodniejszego podziału kodu możesz zainteresować się require.js lub curl.js, choć też będzie dodatkowy narzut na anonimowe funkcje to jeśli dużo piszesz w js powinieneś poczuć wygodę...

teraz pasowało by jeszcze napisać co się dzieje a co by się działo gdy masz zmienne/metody zdefiniowane w prototype (no te zajmują znacznie mniej pamięci gdyż nie są tworzone za każdym razem) - zwłaszcza tyczy się to metod a nie zmiennych, chyba, że chcesz mieć dostęp do zmiennych prywatnych ale wtedy tworzysz za każdym razem nową funkcję w nowej instancji obiektu, prototype jest troszkę ale tylko troszkę podobny do klonowania w php, bardziej jest to obiekt z metodami i zmiennymi "dziedziczony" przez kompozycję, tak jakby referencja do prototypu, no nie tak jakby ale tak jest, więc nie ma narzutu pamięci... podam nietypowe przykłady

po prostu zmienne i funkcje które masz zdefiniowane nie w prototypie są dodatkowym narzutem pamięci, choć nie zawsze, bo metodę możesz przypisać z innego obiektu...
[JAVASCRIPT] pobierz, plaintext
  1. function Test(zmienna1, zmienna_jakas){
  2. //np. tą zmienną zawsze przypisujemy więc nie ma sensu ją definiować w prototype ;]
  3. this.zmienna = zmienna1;
  4. // np. nie zawsze podajemy zmienną w konstruktorze
  5. if(zmienna_jakas)
  6. this.zmienna_domyslna = zmienna_jakas;
  7. if(true) // czytaj niżej komentarze
  8. // ta metoda jest zawsze od nowa tworzona ;/
  9. this.metoda_domyslna = function(){return 6};
  10. }
  11. // tylko taki jest zens definiowania zmiennych w prototype, innego nie widzę ;]
  12. Test.prototype.zmienna_domyslna = 5;
  13. Test.prototype.get_zmienna = function(){return this.zmienna};
  14. // to niżej nie ma sensu robić, chyba, że na zewnątrz obiektu dopisujesz metody lub w konstruktorze w nietypowej sytuacji nadpisujesz metodę
  15. Test.prototype.metoda_domyslna = function(){return 5;};
  16.  
  17. var oTest = new Test(6, 6);
  18. console.log(oTest.get_zmienna(), oTest.zmienna_domyslna, oTest.metoda_domyslna());
  19. delete oTest.zmienna_domyslna;
  20. delete oTest.metoda_domyslna;
  21. console.log(oTest.get_zmienna(), oTest.zmienna_domyslna, oTest.metoda_domyslna());
  22. //dalszy delete na obiekcie i tak nic nie da, trzeba by wykonywać operacje na protytypie
  23. oTest.zmienna_domyslna = 7;
  24. oTest.metoda_domyslna = function(){return 7;}
  25. console.log(oTest.get_zmienna(), oTest.zmienna_domyslna, oTest.metoda_domyslna());
[JAVASCRIPT] pobierz, plaintext
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.