![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 1 Pomógł: 0 Dołączył: 31.05.2013 Ostrzeżenie: (0%) ![]() ![]() |
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(); |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 205 Pomógł: 43 Dołączył: 5.03.2012 Ostrzeżenie: (0%) ![]() ![]() |
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 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 332 Pomógł: 294 Dołączył: 12.10.2008 Skąd: Olkusz Ostrzeżenie: (0%) ![]() ![]() |
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...
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 18:13 |