ध्यान में रखते हुए ऑब्जेक्ट निर्माण पैटर्न, एक तरह से करने के लिए है: इस के साथपुन: प्रयोज्य विधियों और निजी गुणों के साथ जावास्क्रिप्ट ऑब्जेक्ट निर्माण पैटर्न कैसे करें? निजी संपत्तियों के साथ
function MyStack(){
var list = [],
index = 0;
this.push = function(val){
return list[index++] = val;
};
this.pop = function(){// ...}
}
var stack1 = new MyStack(); stack1.push(5);
var stack2 = new MyStack(); stack2.push(11);
समस्या: ढेर के हर उदाहरण यह तरीकों 'पुश' और 'पॉप' की स्वयं की प्रतिलिपि है है।
निर्माता विधि को लागू करने के लिए एक और तरीका है:
function MyStack(){
this.list = [];
this.index = 0;
}
MyStack.prototype = {
insert: function(val){
return this.list[this.index++] = val;
},
pop:function(){//...}
}
समस्या यहाँ: हम सूची और सूचकांक की गोपनीयता खो देते हैं।
क्या कोई तरीका है, जैसे कि हम दोनों विधियों को गुणों और संपत्तियों की गोपनीयता के बीच पुन: उपयोग कर सकते हैं?
मैं समझता हूं कि हम उन तरीकों के लिए यह कर सकते हैं जो वस्तु के किसी भी राज्य पर काम नहीं करते हैं, लेकिन मैं उन तरीकों के बारे में और बात कर रहा हूं जो राज्य पर काम करते हैं।
आप प्रत्येक उदाहरण के एक यादृच्छिक आईडी देने के लिए और डेटा संरचना के कुछ प्रकार में अपनी निजी संपत्तियों संग्रहीत कर सकती है। लेकिन अगर आप कन्स्ट्रक्टर फ़ंक्शंस का उपयोग करते हैं तो मैं केवल निजी संपत्तियों को भूलने का सुझाव दूंगा। जावास्क्रिप्ट उस के लिए नहीं बनाया गया है और किसी भी कामकाज के कुछ नुकसान है। –
@ फ़ेलिक्सक्लिंग इसलिए मान लें कि हमारे पास एक सहायक डीएस है, जैसे {id1: {list: [3,4], currentIndex: 2}, id2: {list: [2,1,4], currentIndex: 3}} .. फिर भी MyStack.prototype.insert = function (val) {currState = this.auxiliaryDS [this.id] में; this.currState.list.push (वैल) .. फिर, यह वास्तव में निजी नहीं है। – sbr
आप फ़ंक्शन के अंदर डेटा स्टोर और कन्स्ट्रक्टर फ़ंक्शन को परिभाषित कर सकते हैं और केवल कन्स्ट्रक्टर फ़ंक्शन का पर्दाफाश कर सकते हैं।डेटा स्टोर तब निजी होगा और बाहर से उपलब्ध नहीं होगा। हां, आईडी पहुंच योग्य होगी, लेकिन अगर आप इसे खराब करना चाहते हैं तो आप इसके लिए एक यादृच्छिक संपत्ति नाम भी उत्पन्न कर सकते हैं। जैसा कि मैंने कहा, जेएस इसके लिए नहीं बनाया गया है और आप जो कुछ भी करते हैं वह हैकी और/या जटिल होगा। उचित दस्तावेज आईएमओ अधिक मूल्यवान है। आप यहां कुछ संबंधित प्रश्न यहां देख सकते हैं: http://stackoverflow.com/search?q=javascript+private+instance+variables+and+prototype+methods –