W JavaScript, pola obiektu są zawsze „publiczne”:Czy prywatni członkowie javascript na zajęciach powodują ogromne obciążenie pamięci?
function Test() {
this.x_ = 15;
}
Test.prototype = {
getPublicX: function() {
return this.x_;
}
};
new Test().getPublicX(); // using the getter
new Test().x_; // bypassing the getter
ale można symulować „prywatny” pole przy użyciu zmiennej lokalnej, a przy użyciu zamknięcie jako getter:
function Test() {
var x = 15;
this.getPrivateX = function() {
return x;
};
}
new Test().getPrivateX(); // using the getter
// ... no way to access x directly: it's a local variable out of scope
Jedną z różnic jest to, że z podejściem „publiczne”, przebojowa każdym przypadku jest taka sama funkcja obiektu:
console.assert(t1.getPublicX === t2.getPublicX);
natomiast z podejściem „prywatnej”, każdy getter instancji jest obiektem o odrębnej funkcji:
console.assert(t1.getPrivateX != t2.getPrivateX);
Jestem ciekawy wykorzystania pamięci tego podejścia. Ponieważ każda instancja ma osobny getPrivateX
, spowoduje to ogromne obciążenie pamięci, jeśli utworzę, powiedzmy, 10k wystąpień?
Test na wydajność tworzenia wystąpień klas z członków prywatnych i publicznych:
pokrewne: http://stackoverflow.com/questions/6204526/understanding-javascript -closures-and-memory-usage – tjameson
Możliwy duplikat: http://stackoverflow.com/questions/2239533/javascript-private-methods-what-is-memory-impact?rq=1 – tjameson
Zarówno podejście publiczne, jak i prywatne są liniowe - 'O (n)' - w zużyciu zasobów (tylko z różnymi 'C'). Ponieważ jest to ostatecznie szczegół implementacji, jedynym sposobem, aby wiedzieć, czy "[wykorzystuje zbyt] dużo narzutów pamięci" jest uruchomienie niektórych testów. Dla obiektu, który jest * znany *, aby mieć 10k + (100k +?) przypadki, wybrałbym prototypu tylko pierwszego sposobu; jest to * moje własne niezweryfikowane * "działanie" impozycji. Ale znowu wszystko to jest liniowy wzrost. –