2012-12-04 11 views
11

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:

Jsperf

+1

pokrewne: http://stackoverflow.com/questions/6204526/understanding-javascript -closures-and-memory-usage – tjameson

+1

Możliwy duplikat: http://stackoverflow.com/questions/2239533/javascript-private-methods-what-is-memory-impact?rq=1 – tjameson

+4

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. –

Odpowiedz

6

Oczywiście byłoby stworzyć narzut pamięci. W przypadku publicznym twoja funkcja należy do prototype nie do instancji, co oznacza, że ​​istnieje tylko jedno wystąpienie, chyba że konkretnie podasz konkretny obiekt, który jest jego własną instancją tej funkcji. W przypadku prywatnym funkcja należy do instancji, co oznacza, że ​​należy wykonać zarządzanie pamięcią.

Co mam na myśli to, co następuje:

var t1 = new Test(); 
t1.getPublicX = function() { 
    return true; 
} 

var t2 = new Test(); 

t1.getPublicX(); // Returns true 
t2.getPublicX(); // Returns 15 

Więc może skończyć się w tej samej sytuacji z członkami publicznych, jak również. Ogólnie odpowiedź na twoje pytanie brzmi: Tak, narzuca się pamięć podczas tworzenia dużej liczby obiektów.

Powinienem też dodać, że pojęcie public i private w javascript wcale nie jest taka sama jak w C++. W C++ prywatne hermetyzuje element tylko do dostępu z klasy, która w javascript nadal może uzyskać dostęp do elementu z dowolnego miejsca.

I nadal po uruchomieniu krótkiego testu narzut jest w rzeczywistości nieistotny. Zakładka zajmuje więcej 40 MB (z pomocną załadowany) niż bez tego jak pokazano w poniższej ekranu:

enter image description here

Link to full size image.

Powiązane problemy