2011-01-28 13 views
5

मेरे पास जावास्क्रिप्ट के बारे में कुछ प्रश्न हैं जिन्हें मुझे कम करने की आवश्यकता है।एक वर्ग को सही तरीके से डिजाइन करना

var dataSource = function (src, extension) { 
    return { 
     exists: function() { 
      // function to check if the source exists (src *should* be an object 
      // and extension should be a string in the format ".property.property.theSource". 
      // this function will return true if src.property.property.theSource exists) 
     }, 
     get: function() { 
      // function will return the source (ex: return src.property.property.theSource) 
     } 
    } 
}(); 

सवाल:: मदद करने के लिए, मैं एक साधारण वर्ग definiton मैं लिख रहा हूँ है,

1) JavaScript का मेरे वर्तमान समझ में डेटा स्रोत बुला() अपने स्वयं के प्रतियों के साथ एक नई वस्तु बनाने जाएगा मौजूदा (0) के और() विधियां प्राप्त करें। क्या मैं सही हूँ?

2) क्या यह लिखने का कोई तरीका है ताकि यदि मैं 1,000,000 डेटा स्रोत ऑब्जेक्ट्स बनाऊं तो मुझे केवल प्रत्येक फ़ंक्शन की एक प्रति होना चाहिए?

3) क्या मुझे भी (2) से चिंतित होना चाहिए?

उत्तर

7

आपके पास एक ऐसा फ़ंक्शन है जो ऑब्जेक्ट की आबादी देता है, जेएस क्लास नहीं।

आप DataSource.prototype का उपयोग कर बाहर की जाँच करना चाहते हैं जाएगा, और आप के लिए गुण जोड़ने या अपने निर्माता के भीतर this को संशोधित किया जाना चाहिए आप के साथ संयोजन के रूप में इस का उपयोग करना चाहते हैं तो new

आप शायद कुछ इस तरह करना चाहिए:

function DataSource(src, extension){ 
    //Make sure this behaves correctly if someone forgets to use new 
    if (! this instanceof DataSource) 
     return new DataSource(src,extension); 
    //store the constructor arguments 
    //so you can use them in the shared methods below 
    this._src=src; 
    this._extension=extension; 
} 
DataSource.prototype.exists=function(){ 
    //use this._src and this._extension here 
    //This method will be available to all 
    //objects constructed by new DataSource(...) 
}; 
DataSource.prototype.get=function(){ 
    //use this._src and this._extension here 
    //This method will be available to all 
    //objects constructed by new DataSource(...) 
}; 

var instance = new DataSource('a source','an extension'); 

संपादित करें:आप 'निजी' चर पसंद करेंगे उल्लेख किया है

का निर्माण बंद केवल पोर्टेबल उन्हें एक _ साथ लगाकर मेरे अनुभव में निजी संपत्तियों अनुकरण, तथापि और अपने संगठन के भीतर एक सम्मेलन होने _ उपसर्ग के चर पर भरोसा नहीं करने के लिए का तरीका है ज्यादातर स्थितियों में पर्याप्त है

+0

फ़ंक्शन असाइनमेंट के बाद सेमीकॉलन को न भूलें। कुछ स्थितियों में, यह पार्सर के लिए एक बुरा अस्पष्टता का कारण बन सकता है। –

+0

ty, हमेशा उनको भूलें, – tobyodavies

+0

'src' और' एक्सटेंशन' को निजी रखा जा सकता है? – JustcallmeDrago

5

Prototype वह है जो आप उपयोग करना चाहते हैं। यह एक बार संग्रहीत किया जाएगा और वस्तु के सभी उदाहरणों से जुड़ा होगा।

+0

क्या मैं अभी भी 'src' और' extension' निजी रख सकता हूं? – JustcallmeDrago

+0

@ जस्टकल्मेड्रागो, आप क्या कर रहे हैं - बंद करना - निजी वर्रों को अनुकरण करने का एकमात्र पोर्टेबल तरीका है। मेरे अनुभव में उन्हें '_' के साथ उपसर्ग करना और आपके संगठन के भीतर एक सम्मेलन होना '_' prefixed चर पर भरोसा नहीं करना अधिकांश स्थितियों में पर्याप्त है – tobyodavies

+0

@Toby: आह। यही वह है जिसे मैं ढूंढ रहा था। यदि आप अपने उत्तर में उस भेद को जोड़ते हैं, तो मैं इसे स्वीकार करूंगा! – JustcallmeDrago

0

आप कर सकते हैं इस तरह की कक्षा को आसानी से कई प्रतियां बनाने के लिए बनाएं।

  • संपादित करें - जोड़ी निर्माता तर्क।

    function DataSource(src, extension) { 
        this.src = src, 
        this.extension = extension, 
        this.exists = function() { 
         // function to check if the source exists (src *should* be an object 
         // and extension should be a string in the format ".property.property.theSource". 
         // this function will return true if src.property.property.theSource exists) 
        }, 
        this.get = function() { 
         // function will return the source (ex: return src.property.property.theSource) 
        } 
    } 
    dataSource1 = new DataSource(); 
    dataSource2 = new DataSource(); 
    
+0

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

+1

क्योंकि यह वही है जैसा आपके पास पहले से था – tobyodavies

+0

@tobyodavies यह वही कैसा है? मेरी वस्तु एक वर्ग से बनाई जा रही है जिसे आवश्यक होने पर लाइन को प्रोटोटाइप किया जा सकता है। इस सवाल में जिस तरह से बनाया गया है, वह किसी वर्ग के बाद से ऑब्जेक्ट को प्रोटोटाइप करने की अनुमति नहीं देता है। मैं क्या खो रहा हूँ? – sissonb

0

आप वापसी मूल्यों में वर्ग चर डाला है। तो आप जितनी सारी वस्तुओं को तत्काल बनाते हैं, उतने सारे उदाहरण बनाए जाएंगे।

आपकी आवश्यकता के अनुसार, यदि आप रिटर्न प्रकारों से कक्षा चर अलग करते हैं और केवल एक बार (सभी के लिए) घोषित करते हैं तो प्रत्येक इंस्टेंस के लिए वे गुण उपलब्ध होंगे। यह उन चर का मतलब है (परिभाषित ExampleClass.prototype के रूप में = समारोह() {}) C/C++

0

ES6 वर्ग वाक्यविन्यास के लिए अपडेट किया गया (इस लेखन @ tobyodavies के जवाब का एक और तरीका है) में एक स्थिर चर के रूप में काम करेगा:

class DataSource { 
    constructor(src, extension) { 
     this._src = src; 
     this._extension = extension; 
    } 
    exists() { 

    } 
    get() { 

    } 
}; 
var instance = new DataSource('a source','an extension'); 

यह जांचने की कोई आवश्यकता नहीं है कि कक्षा को नए उदाहरण के साथ बुलाया गया था, क्योंकि यह ES6 कक्षाओं के साथ संभव नहीं है। यह Class constructor DataSource cannot be invoked without 'new' त्रुटि के साथ वापस आ जाएगा।

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