2012-12-04 12 views
11

जावास्क्रिप्ट में एक वस्तु के क्षेत्र हमेशा "सार्वजनिक" कर रहे हैं:कक्षाओं में जावास्क्रिप्ट निजी सदस्यों को एक विशाल स्मृति ओवरहेड का कारण बन जाएगा?

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 उदाहरण बनाउंगा, तो क्या यह एक बड़ी मेमोरी ओवरहेड का कारण बन जाएगा?

निजी और सार्वजनिक सदस्यों के साथ वर्गों के उदाहरण बनाने पर एक प्रदर्शन परीक्षण:

Jsperf

+1

संबंधित: http://stackoverflow.com/questions/6204526/understanding-javascript टैब नीचे स्क्रीनशॉट में शो के रूप में यह बिना 40mb अधिक (गूगल लोड के साथ) की तुलना में ले जाता है -closures-and-memory-use – tjameson

+1

संभावित डुप्लिकेट: http://stackoverflow.com/questions/2239533/javascript-private-methods-what-is-the-memory-impact?rq=1 – tjameson

+4

सार्वजनिक और निजी दोनों दृष्टिकोण रैखिक हैं - 'ओ (एन)' - संसाधन खपत में (बस अलग 'सी' के साथ)। चूंकि यह आखिरकार एक कार्यान्वयन विस्तार है, यह ज्ञात करने का एकमात्र तरीका है कि यह "[बहुत अधिक मेमोरी ओवरहेड का उपयोग करता है" कुछ परीक्षण चलाने के लिए है। एक ऑब्जेक्ट के लिए जो * ज्ञात * है 10k + (100k +?) उदाहरण, मैं पहले प्रोटोटाइप-केवल विधि का चयन करूंगा; यह * मेरा अपना असत्यापित * "प्रदर्शन" लगाव है। लेकिन फिर, यह सभी रैखिक विकास है। –

उत्तर

6

बेशक यह स्मृति भूमि के ऊपर बना सकेगी। सार्वजनिक मामले में आपका कार्य prototype से संबंधित है, उदाहरण के लिए, जिसका अर्थ है कि केवल एक उदाहरण है, जब तक कि आप विशेष रूप से उस विशिष्ट कार्य को उस कार्य का अपना उदाहरण न दें। निजी मामले में फ़ंक्शन उदाहरण से संबंधित है जिसका अर्थ है कि आपको स्मृति प्रबंधन करने की आवश्यकता है।

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

var t2 = new Test(); 

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

तो तुम साथ ही सार्वजनिक सदस्यों के साथ एक ही स्थिति में खत्म कर सकते हैं:

क्या मैं यह मतलब पीछा कर रहा है। आम तौर पर आपके प्रश्न का उत्तर यह है: हां, बड़ी संख्या में ऑब्जेक्ट्स को तुरंत चालू करते समय एक मेमोरी ओवरहेड होता है।

मैं भी जोड़ना चाहिए कि javascript में public और private की धारणा C++ में के रूप में सभी एक ही पर नहीं है। C++ निजी में केवल कक्षा के भीतर से पहुंच के लिए सदस्य को encapsulates, जो javascript में आप अभी भी सदस्य से कहीं भी पहुंच सकते हैं।

और अभी भी एक छोटा परीक्षण चलाने के बाद ओवरहेड वास्तव में महत्वहीन है।

enter image description here

Link to full size image.

संबंधित मुद्दे