2010-10-10 16 views
6

मुझे वर्तमान में जावास्क्रिप्ट में सिंगलेट बनाने के दो तरीके पता हैं। पहला:रिटर्न का उपयोग किये बिना एक कन्स्ट्रक्टर के साथ जावास्क्रिप्ट सिंगलटन कैसे बनाएं?

var singleton = { 
publicVariable: "I'm public", 
publicMethod: function() {} 
}; 

यह बिल्कुल सही है कि इसमें कोई कन्स्ट्रक्टर नहीं है जहां मैं प्रारंभिक कोड चला सकता हूं।

दूसरा:

(function() { 

var privateVariable = "I'm private"; 
var privateFunction = function() {} 

return { 
publicVariable: "I'm public", 
publicMethod: function() {} 
} 

})(); 

पहले संस्करण निजी संपत्तियों नहीं है और न ही यह एक निर्माता है, लेकिन यह तेजी से और आसान है। दूसरा संस्करण अधिक जटिल, बदसूरत है, लेकिन इसमें एक कन्स्ट्रक्टर और निजी गुण हैं।

मुझे निजी संपत्तियों की आवश्यकता नहीं है, मैं सिर्फ एक कन्स्ट्रक्टर रखना चाहता हूं। क्या मुझे कुछ याद आ रहा है या केवल दो दृष्टिकोण हैं जो मुझे मिल गए हैं?

+1

दूसरा दृष्टिकोण "बदसूरत" नहीं है; यह भाषा का एक प्राकृतिक हिस्सा है। कार्यों के साथ कार्यों को बनाने में सक्षम होने के कारण जावास्क्रिप्ट की सबसे शक्तिशाली विशेषताएं हैं। – Pointy

उत्तर

7
function Singleton() { 
    if (Singleton.instance) 
    return Singleton.instance; 
    Singleton.instance = this; 
    this.prop1 = 5; 
    this.method = function() {}; 
}​ 
+0

मुझे लगता है कि यह समाधान स्पष्ट नहीं है, क्योंकि इस कन्स्ट्रक्टर का उपयोग अगला है: 'नया सिंगलटन() '। इसका मतलब है कि एक डेवलपर प्रत्येक बार जब वह इस कोड को लिखता है तो एक नया उदाहरण प्राप्त करने की अपेक्षा करता है। अर्थात। 'नया सिंगलटन() == नया सिंगलटन()' 'सत्य 'देता है लेकिन उसे' झूठा 'वापस करना होगा। – pto3

1
var singleton = new function() { // <<----Notice the new here 
    //constructorcode.... 

    this.publicproperty ="blabla"; 
} 

यह मूल रूप से एक समारोह का निर्माण, तो तुरन्त चर सिंगलटन करने के लिए इसे का एक नया instace assiging के समान है। Var सिंगलटन = नई सिंगलटन ऑब्जेक्ट() की तरह;

मैं अत्यधिक एकमात्र हालांकि निष्पादन आदेश की वजह से Javscript में इस तरह से उपयोग करने के खिलाफ सलाह जहां फाइल में आप अपने खुद के तर्क पर वस्तु और न जगह पर आधारित है।

1

इसके बारे में क्या?

var Singleton = (function() { 
    var instance; 

    // this is actual constructor with params 
    return function(cfg) { 
     if (typeof instance == 'undefined') { 
      instance = this; 
      this.cfg = cfg; 
     } 
     return instance; 
    }; 
})(); 

var a = new Singleton('a'); 
var b = new Singleton('b'); 

//a === b; <-- true 
//a.cfg <-- 'a' 
//b.cfg <-- 'a' 
2

यहाँ बंद के साथ अपने समाधान है:

function Singleton() { 

    Singleton.getInstance = (function(_this) { 
     return function() { return _this; }; 
    })(this); 
} 

टेस्ट:

var foo = new Singleton(); 
var bar = Singleton.getInstance(); 
foo === bar; // true 
2

आप बस अपने सिंगलटन आरंभ करने के लिए एक जगह के लिए देख रहे हैं, यह कैसे के बारे में है?

var singleton = { 
    'pubvar': null, 
    'init': function() { 
     this.pubvar = 'I am public!'; 
     return this; 
    } 
}.init(); 

console.assert(singleton.pubvar === 'I am public!'); 

सरल और सुरुचिपूर्ण।

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

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