जावास्क्रिप्ट में एक वस्तु के क्षेत्र हमेशा "सार्वजनिक" कर रहे हैं:कक्षाओं में जावास्क्रिप्ट निजी सदस्यों को एक विशाल स्मृति ओवरहेड का कारण बन जाएगा?
function Test() {
this.x_ = 15;
}
Test.prototype = {
getPublicX: function() {
return this.x_;
}
};
new Test().getPublicX(); // using the getter
new Test().x_; // bypassing the 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
console.assert(t1.getPublicX === t2.getPublicX);
"निजी" दृष्टिकोण के साथ, जबकि प्रत्येक:
एक अंतर यह है कि "सार्वजनिक" दृष्टिकोण के साथ, प्रत्येक उदाहरण के गेटर एक ही समारोह वस्तु है
console.assert(t1.getPrivateX != t2.getPrivateX);
मैं इस दृष्टिकोण की स्मृति के उपयोग के बारे में उत्सुक हूँ: उदाहरण के गेटर एक अलग समारोह वस्तु है। चूंकि प्रत्येक इंस्टेंस में getPrivateX
अलग है, इसलिए अगर मैं 10k उदाहरण बनाउंगा, तो क्या यह एक बड़ी मेमोरी ओवरहेड का कारण बन जाएगा?
निजी और सार्वजनिक सदस्यों के साथ वर्गों के उदाहरण बनाने पर एक प्रदर्शन परीक्षण:
संबंधित: http://stackoverflow.com/questions/6204526/understanding-javascript टैब नीचे स्क्रीनशॉट में शो के रूप में यह बिना 40mb अधिक (गूगल लोड के साथ) की तुलना में ले जाता है -closures-and-memory-use – tjameson
संभावित डुप्लिकेट: http://stackoverflow.com/questions/2239533/javascript-private-methods-what-is-the-memory-impact?rq=1 – tjameson
सार्वजनिक और निजी दोनों दृष्टिकोण रैखिक हैं - 'ओ (एन)' - संसाधन खपत में (बस अलग 'सी' के साथ)। चूंकि यह आखिरकार एक कार्यान्वयन विस्तार है, यह ज्ञात करने का एकमात्र तरीका है कि यह "[बहुत अधिक मेमोरी ओवरहेड का उपयोग करता है" कुछ परीक्षण चलाने के लिए है। एक ऑब्जेक्ट के लिए जो * ज्ञात * है 10k + (100k +?) उदाहरण, मैं पहले प्रोटोटाइप-केवल विधि का चयन करूंगा; यह * मेरा अपना असत्यापित * "प्रदर्शन" लगाव है। लेकिन फिर, यह सभी रैखिक विकास है। –