2010-07-12 12 views
5

में निजी तरीके जावास्क्रिप्ट में ओओपी का उपयोग करने के लिए अपेक्षाकृत नया है, और मैं सोच रहा हूं कि निजी तरीकों के लिए सबसे अच्छा अभ्यास क्या है। अभी, मैं अपनी कक्षाएं बनाने के लिए mootools का उपयोग कर रहा हूं और मैं अंडरस्कोर के साथ उपसर्ग करके निजी वर्गों का अनुकरण कर रहा हूं और खुद को कक्षा के बाहर विधि को कॉल न करने के लिए मजबूर कर रहा हूं। तो मेरी कक्षा इस तरह दिखती है:Mootools कक्षा

var Notifier = new Class(
{ 
    ... 
    showMessage: function(message) { // public method 
     ... 
    }, 

    _setElementClass: function(class) { // private method 
     ... 
    } 
}); 

क्या यह जेएस में निजी तरीकों को संभालने का एक अच्छा/मानक तरीका है?

उत्तर

12

MooTools protect फ़ंक्शन पर विधि प्रदान करता है, ताकि आप Class के बाहर कॉल होने से बचाने के लिए किसी भी विधि पर सुरक्षा कर सकें। तो अगर आप कर सकते हैं:

​var Notifier = new Class({ 
    showMessage: function(message) { 

    }, 
    setElementClass: function(klass) { 

    }.protect() 
})​; 

var notifier = new Notifier(); 
notifier.showMessage(); 
notifier.setElementClass(); 
> Uncaught Error: The method "setElementClass" cannot be called. 

ऐसा नहीं है कि class जावास्क्रिप्ट में एक भविष्य आरक्षित कीवर्ड है और यह कब का उपयोग कर अपने कोड टूट सकता है। यह निश्चित रूप से इस बिंदु पर सफारी पर टूट जाता है, लेकिन अन्य ब्राउज़रों में व्यवहार की भी गारंटी नहीं है, इसलिए class का उपयोग पहचानकर्ता के रूप में नहीं करना बेहतर है।

बंद करने के लिए protect का उपयोग करने का एक फायदा यह है कि यदि आप इस कक्षा को बढ़ाते हैं, तो भी आप उप-वर्गों में संरक्षित विधियों तक पहुंच सकते हैं।

Notifier.Email = new Class({ 
    Extends: Notifier, 

    sendEmail: function(recipient, message) { 
     // can call the protected method from inside the extended class 
     this.setElementClass('someClass'); 
    } 
}); 

var emailNotifier = new Notifier.Email(); 
emailNotifier.sendEmail("a", "b"); 
emailNotofier.setElementClass("someClass"); 
> Uncaught Error: The method "setElementClass" cannot be called. 

आप इस तरह लगाकर या पहले या एक विधि के बाद _ प्रत्यय लगाना के रूप में एक नामकरण परंपरा का उपयोग करना चाहते हैं, तो वह बिल्कुल ठीक भी है। या आप संरक्षित तरीकों के साथ _ को भी जोड़ सकते हैं।

+0

यह वही है जो मैं खोज रहा था, बहुत बहुत धन्यवाद! मुझे अगली बार mootools दस्तावेज़ों को दोबारा जांचना होगा। – aubreyrhodes

2

ठीक है, जब तक आप लगातार बने रहें तो आपको परेशानी नहीं होगी।

हालांकि, पैटर्न है बंद के माध्यम से जावास्क्रिप्ट में वास्तविक गोपनीयता बनाने के लिए।

var Notifier = function() { 

    // private method 
    function setElementClass(class) { 
     //... 
    } 

    // public method 
    this.showMessage = function(message) { 
     // ... 
     setElementClass(...) // makes sense here 
    }; 
}; 

var noti = new Notifier(); 
noti.showMessage("something");  // runs just fine 
noti.setElementClass("smth else"); // ERROR: there isn't such a method 

आप सार्वजनिक तरीकों कि विरासत में मिला है और सभी वस्तुओं (छोटे स्मृति पदचिह्न) के बीच साझा कर रहे हैं जोड़ना चाहते हैं, तो आप उन्हें वस्तु के प्रोटोटाइप को जोड़ना चाहिए।

// another way to define public functions 
// only one will be created for the object 
// instances share this function 
// it can also be used by child objects 
// the current instance is accessed via 'this' 
Notifier.prototype.showMessage = function() { 
    // ... 
    this.otherPublicFunction(...); 
};​ 

मैं सुझाव है कि आप जावास्क्रिप्ट में वस्तुओं से निपटने के कच्चे रास्ते में देखना है, क्योंकि उसके बाद ही आप को पता है तुम क्या कर रहे हैं सक्षम हो जाएगा। वर्गों की तरह मूटूल यह छिपाने के लिए अच्छा होगा कि यह भाषा दूसरों से अलग है। लेकिन सच्चाई यह है कि यह इतना बड़ा है कि यह सोचने के लिए बेवकूफ होगा कि जब आप class जावास्क्रिप्ट में किसी अन्य वर्ग-आधारित ओओ भाषा की तरह कहते हैं तो आप वही काम करते हैं।

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