यह अपनी आवश्यकताओं और रिश्तेदार प्रदर्शन पर निर्भर करता है के लिए और अधिक कुशल हो जाएगा। जावास्क्रिप्ट सबसे अधिक प्रकार की सुरक्षित भाषा नहीं है और सदस्य दृश्यता के संबंध में बहुत मजबूत नहीं है। परंपरागत रूप से आप जावास्क्रिप्ट प्रकार के भीतर "निजी", "सार्वजनिक विशेषाधिकार" और "सार्वजनिक" दृश्यता प्राप्त कर सकते हैं।
आप का उपयोग निजी और सार्वजनिक विशेषाधिकार प्राप्त सदस्यों की घोषणा कर सकते हैं:
function FooClass()
{
var privateVar = 1;
function privateFn()
{
return privateVar; // etc...
}
this.publicVar = 2;
this.publicFn = function()
{
return privateFn();
}
}
यह उदाहरण एक समारोह बंद, एक समारोह घोषणा कि गुंजाइश जहां समारोह परिभाषित किया गया है से मूल्यों को भी शामिल होते हैं जो उपयोग करता है। यह स्वीकार्य है जब सदस्य दृश्यता आवश्यक है लेकिन ओवरहेड का कारण बन सकती है। जावास्क्रिप्ट दुभाषिया प्रत्येक तत्कालता के लिए निजी एफएन या सार्वजनिक परिभाषाओं का पुन: उपयोग नहीं कर सकता क्योंकि वे बाहरी दायरे में चर या कार्यों का संदर्भ लेते हैं। नतीजतन FooClass के प्रत्येक उदाहरण के परिणामस्वरूप निजी एफएन और publicFn के लिए अतिरिक्त संग्रहण स्थान होता है। यदि प्रकार निरंतर या संयम में उपयोग किया जाता है तो प्रदर्शन जुर्माना अस्वीकार्य है। यदि पृष्ठ में अक्सर उपयोग किया जाता है, या यदि पृष्ठ "AJAX" शैली से अधिक है, जहां पृष्ठ को तब तक मुक्त नहीं किया जाता है जब पृष्ठ अनलोड नहीं किया जाता है तो जुर्माना अधिक दिखाई दे सकता है।
प्रोटोटाइप सदस्यों का उपयोग करने का एक वैकल्पिक दृष्टिकोण है। ये अप्रतिबंधित सार्वजनिक सदस्य हैं। चूंकि जावास्क्रिप्ट पूरी तरह से टाइप-सुरक्षित नहीं है और इसे लोड होने के बाद संशोधित करना अपेक्षाकृत आसान है, इसलिए सुरक्षा टाइप करें और सदस्य दृश्यता इंटीरियर टाइप करने के लिए उपयोग को नियंत्रित करने के लिए विश्वसनीय नहीं हैं। प्रदर्शन कारणों से, दृश्यता नियमों का अनुमान लगाने के लिए सदस्य नामकरण का उपयोग करके एएसपी.NET अजाक्स जैसे कुछ ढांचे। उदाहरण के लिए, ASP.NET अजाक्स में एक ही प्रकार लग सकता है जैसे: निजी दायरे वाले सदस्यों
function FooClass2()
{
this._privateVar = 1;
this.publicVar = 2;
}
FooClass2.prototype =
{
_privateFn : function()
{
return this._privateVar;
},
publicFn : function()
{
return this._privateFn();
}
}
FooClass2.registerClass("FooClass2");
इस मामले में नाम केवल, "_" उपसर्ग एक निजी सदस्य चर मतलब करने के लिए माना जाता है में निजी होते हैं। यह सदस्य को वास्तव में निजी होने से रोकने का नकारात्मक पक्ष है, लेकिन वस्तु के इन-मेमोरी पैचिंग की अनुमति देने के ऊपर। दूसरा मुख्य लाभ यह है कि सभी कार्यों को दुभाषिया और इंजन द्वारा एक बार बनाया जाता है और इस प्रकार के लिए बार-बार उपयोग किया जाता है। "यह" कीवर्ड तब प्रकार के उदाहरण को संदर्भित करता है भले ही फ़ंक्शन संदर्भ स्वयं समान है।
एक तरह से कार्रवाई में अंतर को देखने के लिए दोनों प्रकार के साथ इस प्रयास करने के लिए है
var fooA = new FooClass(), fooB = new FooClass();
alert(fooA.publicFn===fooB.publicFn); // false
var foo2A = new FooClass2(), foo2B = new FooClass2();
alert(foo2A.publicFn===foo2B.publicFn); // true
(यदि आप ASP.NET अजाक्स की जरूरत नहीं है, तो आप उस registerClass() कॉल FooClass2 में अंतिम पंक्ति अनदेखा कर सकते हैं)
तो यह प्रकार की सुरक्षा और सदस्य दृश्यता बनाम बनाम मामला है।प्रदर्शन और स्मृति में पैच करने की क्षमता
आपका FooClass उदाहरण गलत है। नए के अर्थशास्त्र प्रभावी ढंग से हैं: "var foo = {}; foo .__ proto__ = FooClass.prototype; var temp = FooClass.call (temp); अगर (IsObject (temp)) foo = temp;"। इसका मतलब है कि आपके उदाहरण में foo नई वस्तु होगी "{reallypublicfn: function() {...}}" इसलिए इसमें FooClass प्रोटोटाइप या publicfn फ़ंक्शन – olliej