• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Publiczna metoda dołączona do prototypu obiektu, która zwraca jego prywatne atrybuty

0 głosów
681 wizyt
pytanie zadane 14 lutego 2016 w JavaScript przez ScriptyChris Mędrzec (190,170 p.)

Tworzę konstruktor, w którym umieszczam metody wyrzucające prywatne zmienne do obiektów:

    function Customer(name, ownPin)
    {
        var ownerName = name,
            ownerPin = ownPin;

        this.getOwnerName = function()
        {
            console.log('Owner name is: ', ownerName);
        };

        this.getOwnerPinCode = function()
        {
            console.log('Owner PIN code is: ', ownerPin);
        }
    }

    var owner = new Customer('tester', 1234);
    owner.getOwnerName();
    owner.getOwnerPinCode();

Jest ok, z tym że gdy chcę przesunąć te dwie metody (getOwnerName() i getOwnerPinCode()) z samego konstruktora do łańcucha (wykorzystać dziedziczenie prototypowe) tworzonych obiektów, to nie wiem jak to uczynić.

    Customer.prototype.getOwnerPinCode = function()
    {
        return this.ownerPin;
    };

Gdy powyższy kod umieszczę pod konstruktorem, to ani this.ownerPin, ani ownerPin nie są widoczne (są undefined) - co jest w sumie logiczne. Zatem w jaki sposób uzyskać dostęp do tych zmiennych? Metody .call/.bind?

Chodzi mi o to, aby konstruktor obiektu tworzył tylko jego atrybuty, zaś same funkcje (aby oszczędzać pamięć - taki jest chyba tego cel) były doczepione do prototypu. Wtedy wszystkie funkcje będą miały dostęp do prywatnych atrybutów tych obiektów, zaś same funkcje nie będą tworzone wielokrotnie.

1 odpowiedź

+1 głos
odpowiedź 14 lutego 2016 przez Comandeer Guru (607,960 p.)
wybrane 14 lutego 2016 przez ScriptyChris
 
Najlepsza
W takim wypadku nie da się tego zrobić. Musiałbyś skorzystać z closure i patternu factory… ale to raczej przerost formy nad treścią.
komentarz 14 lutego 2016 przez Comandeer Guru (607,960 p.)
Ale wiesz, że w przeglądarce jest baza danych? ;) IndexedDB.
komentarz 14 lutego 2016 przez ScriptyChris Mędrzec (190,170 p.)
Nie wiedziałem. Myślałem, że HTML5 Web Storage, Cache i Cookies to wszystko, z czego przeglądarka może korzystać do przechowania danych (tzn. te 3 terminy kojarzę, ale jeszcze nie wdrażałem się w ich możliwości i zastosowania) :)

Czyli obiektów nie można tworzyć dynamicznie i zamiast tego (by nie robić pełnoprawnej bazy danych), można prowizorycznie wspomóc się bazą przeglądarki?
komentarz 14 lutego 2016 przez Comandeer Guru (607,960 p.)

Da się, bo właśnie taki obiekt będziesz sobie do tej bazy zapisywał (w sumie można też przejechać to JSON.stringify i wsadzić do localStorage).

komentarz 14 lutego 2016 przez ScriptyChris Mędrzec (190,170 p.)
Ok, to co miałeś na myśli mówiąc, że JS nie tworzy sam obiektów? Ja pytałem własnie o dynamiczne tworzenie obiektów (wg "schematu", który jest zapisany w konstruktorze) na podstawie danych, które poda użytkownik. :)
komentarz 14 lutego 2016 przez Comandeer Guru (607,960 p.)

Myślałem, że chodziło Ci o to, że JS dla każdego input tworzy obiekt ;)

Podobne pytania

0 głosów
1 odpowiedź 319 wizyt
pytanie zadane 10 kwietnia 2020 w JavaScript przez maslokeeper01 Użytkownik (620 p.)
0 głosów
1 odpowiedź 478 wizyt
+1 głos
0 odpowiedzi 760 wizyt

93,720 zapytań

142,641 odpowiedzi

323,264 komentarzy

63,268 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...