Myślę, że źle zrozumiałem, jak działa prototypowe dziedzictwo Javascript. W szczególności, wewnętrzne zmienne prototypów wydają się być współdzielone między wieloma różnymi pod-obiektami. Najłatwiej jest zilustrowanie z kodem:Zmienne prywatne w odziedziczonych prototypach
var A = function()
{
var internal = 0;
this.increment = function()
{
return ++internal;
};
};
var B = function() {};
// inherit from A
B.prototype = new A;
x = new B;
y = new B;
$('#hello').text(x.increment() + " - " + y.increment());
ten wyprowadza 1 - 2
(przetestować go na JSBin), a ja w pełni spodziewać, że wynik będzie 1 - 1
, ponieważ chciałem dwa oddzielne obiekty.
Jak mogę się upewnić, że obiekt A
nie jest obiektem współdzielonym między wieloma instancjami B
?
Aktualizacja: This article podkreśla niektóre z zagadnień:
Problem polega na tym, że zakres każde podejście wykorzystuje do tworzenia zmiennej prywatnej, która działa dobrze, jest również zamknięcie, w działaniu, że wyniki w przypadku zmiany zmiennej prywatnej dla jednej instancji obiektu, jest ona zmieniana dla wszystkich. To znaczy. to bardziej przypomina prywatną własność statyczną niż rzeczywistą zmienną prywatną.
Tak więc, jeśli chcesz mieć coś prywatnego, bardziej niepubliczną stałą, każde z powyższych podejść jest dobre, ale nie dla rzeczywistych zmiennych prywatnych. Prywatne zmienne działają bardzo dobrze tylko z obiektami singleton w JavaScript.
Rozwiązanie: Jak na odpowiedź BGerrissen użytkownika, zmieniając Deklaracji B
i pozostawiając prototypu działa zgodnie z przeznaczeniem:
var B = function() { A.apply(this, arguments); };
Ale cały Chodzi o to, że funkcjonalność należy w 'A' i jest dzielone między różnymi pod-„klas”(', 'C' B' i 'D'). Czy nie ma możliwości dla niestacjonarnych zmiennych prywatnych w nadklasach w JavaScript? –
Powszechnym sposobem oznaczania intencji "prywatnych" (czyli ostrzegania programistów, że coś specjalnego dzieje się z właściwością) jest użycie podkreślenia jako przedrostka nazwy właściwości (np. Obj._privateMember). Chociaż będzie to działało z dziedziczeniem łańcuchów i liczb, zaczyna być bardziej złożone, gdy używamy obiektów i tablic jako właściwości. – BGerrissen
Nie jestem dokładnie tego, o co pytasz. Czy chcesz, aby zmienna zdefiniowana w funkcji 'A' była dostępna dla metod' B', 'C' i' D', ale nigdzie indziej? Staraj się nie myśleć o rzeczach w JavaScript pod względem cech innych języków (takich jak Java czy C#). JavaScript po prostu nie ma klas. Posiada obiekty dziedziczące właściwości z innych obiektów za pośrednictwem łańcucha prototypów. –