2010-04-24 13 views
12

में "निजी" विधियों से "सार्वजनिक" विधियों तक पहुंच प्राप्त करना क्या कक्षा में "निजी" लोगों से "सार्वजनिक" जावास्क्रिप्ट फ़ंक्शंस को कॉल करने का कोई तरीका है?जावास्क्रिप्ट क्लास

नीचे वर्ग की जाँच करें:

publicMethod परिभाषित नहीं है: [इस पर तोड़

var class = new Class(); 
class.test(); 

Firebug इस त्रुटि देता है:

function Class() 
{ 
    this.publicMethod = function() 
    { 
     alert("hello"); 
    } 

    privateMethod = function() 
    { 
     publicMethod(); 
    } 

    this.test = function() 
    { 
     privateMethod(); 
    } 
} 

यहाँ कोड मैं चलाने है त्रुटि] publicMethod();

क्या वैश्विक क्लाइंट वैरिएबल (i.e. के बिना publicMethod() के भीतर publicMethod() को कॉल करने का कोई अन्य तरीका है। class.publicMethod()]?

+4

मुझे आशा है कि यह सिर्फ अपने उदाहरण में कोई गलती यहाँ है, लेकिन अपने 'privateMethod' एक वैश्विक चर रहा है नहीं कर रहा हूँ। –

+0

फ़ायरफ़ॉक्स में यदि मैं 'class.privateMethod()' कहता हूं तो एक त्रुटि होती है जबकि 'class.publicMethod()' ठीक काम करता है, इसलिए ऐसा लगता है कि दोनों कार्यों के बीच कुछ अंतर है। – mon4goos

उत्तर

5

स्वीकार किए जाते हैं जवाब संभवतः अवांछनीय दुष्प्रभाव यह है कि publicMethod, test, और privateMethod के अलग प्रतियां प्रत्येक उदाहरण में बनाया जाएगा है। इस से बचने के लिए मुहावरा है:

function Class() 
{} 

Class.prototype=(function() 
{ 
    var privateMethod = function(self) 
    { 
     self.publicMethod(); 
    } 


    return 
    { 
     publicMethod: function() 
     { 
      alert("hello"); 
     }, 
     test: function() 
     { 
      privateMethod(this); 
     } 
    }; 
}()); 

दूसरे शब्दों में, आप एक तर्क के रूप में निजी समारोह के लिए this पारित करने के लिए की जरूरत है। बदले में, आपको निजी और सार्वजनिक कार्यों के अपने संस्करणों के साथ प्रत्येक उदाहरण को प्रदूषित किए बिना सत्य प्रोटोटाइप प्राप्त होता है।

+2

अच्छा! पास होने के बजाय, आप हमेशा 'privateMethod.call (यह)' भी कर सकते हैं – gnarf

8

आप this पर संदर्भ रखने के लिए निर्माता के दायरे में एक चर को सहेज सकते हैं।

कृपया ध्यान दें: अपने उदाहरण में, आप बाहर varprivateMethod = function() पहले कि privateMethod वैश्विक बनाने छोड़ दिया है। मैं यहाँ समाधान अद्यतन किया है:

function Class() 
{ 
    // store this for later. 
    var self = this; 
    this.publicMethod = function() 
    { 
    alert("hello"); 
    } 

    var privateMethod = function() 
    { 
    // call the method on the version we saved in the constructor 
    self.publicMethod(); 
    } 

    this.test = function() 
    { 
    privateMethod(); 
    } 
} 
2

टोरज़बोरो का जवाब सबसे अच्छा है, क्योंकि यह निजी सदस्यों की कई प्रतियों के निर्माण से बचाता है। मुझे आश्चर्य है कि क्रॉकफ़ोर्ड इसका बिल्कुल उल्लेख नहीं करता है। वैकल्पिक रूप से, वाक्य रचना आप सार्वजनिक सदस्य कार्यों की घोषणा के लिए पसंद करते हैं पर निर्भर करता है, तो आप ऐसा कर सकते हैं:

function Class() 
{} 

(function() { 
    var privateMethod = function(self) { 
     self.publicMethod(); 
    }; 

    Class.prototype.publicMethod = function() { 
     alert('hello'); 
    }; 

    Class.prototype.test = function() { 
     privateMethod(this); 
    }; 
}()); 
0

इस दृष्टिकोण एक उचित एक नहीं है? मुझे यकीन है कि हालांकि

var klass = function(){ 
    var privateMethod = function(){ 
    this.publicMethod1(); 
    }.bind(this); 

    this.publicMethod1 = function(){ 
    console.log("public method called through private method"); 
    } 

    this.publicMethod2 = function(){ 
    privateMethod(); 
    } 
} 

var klassObj = new klass(); 
klassObj.publicMethod2();