2010-08-24 6 views
16

मैं एक जावास्क्रिप्ट "वर्ग" इसलिए की तरह परिभाषित किया है:क्या मैं जावास्क्रिप्ट में बंद-परिभाषित "कक्षा" का विस्तार कर सकता हूं?

var Welcomer = function(name) { 
    var pName = name; 
    var pMessage = function() { 
    return "Hi, " + pName + "!"; 
    }; 

    return { 
    sayHi: function() { 
     alert(pMessage()); 
    } 
    }; 
}; 

new Welcomer('Sue').sayHi(); 

वहाँ एक रास्ता करने के लिए इस तरह से है कि मैं जनता के तरीकों को फिर से परिभाषित और निजी तरीके और चर के लिए उपयोग किया जा सकता है में Welcomer "उपवर्ग" है? निम्नलिखित मुझे सार्वजनिक तरीकों के लिए उपयोग दे देंगे, लेकिन निजी लोगों के लिए नहीं:

var UnhappyWelcomer = function(name) { 
    var pSadMessage = function() { 
    // won't work, b/c I don't have access to pMessage 
    return pMessage() + " Miserable day, innit?"; 
    }; 

    return { 
    sayHi: function() { 
     alert(pSadMessage()); 
    } 
    }; 
}; 
UnhappyWelcomer.prototype = Welcomer(); // failed attempt at inheritance 

new UnhappyWelcomer().sayHi(); 
+1

आप [इस आलेख] (http://mckoss.com/jscript/object.htm) पर पढ़ना चाहेंगे। –

+0

उस लेख को बुकमार्क करना। Thx –

उत्तर

10

आपके प्रश्न का सरल उत्तर नहीं है।

आप उन var परिभाषित चीजों तक पहुंच हासिल करने जब तक आपके समारोह में एक ही दायरे में है कुछ नहीं कर सकते हैं, या आप किसी भी तरह की जानकारी (यह लौटने, या this पर यह निर्धारित करके) 'सार्वजनिक करना'।

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

var Welcomer = function(name) { 
    var _protected = { 
    name: name, 
    message: function() { 
     return "Hi, " + _protected.name + "!"; 
    } 
    }; 

    return { 
    extendWith: function(extender) { 
     extender.call(this, _protected); 
     return this; 
    }, 
    sayHi: function() { 
     alert(_protected.message()); 
    } 
    }; 
}; 

var UnhappyWelcomer = function(name) { 
    var self = Welcomer(name).extendWith(function(_protected) { 
    _protected.sadMessage = function() { 
     return _protected.message() + " Miserable day, innit?"; 
    }; 
    // extending the public while still having scope to _protected... 
    this.sayHi = function() { 
     alert(_protected.sadMessage()); 
    }; 
    }); 
    return self; 
}; 

UnhappyWelcomer('bob').sayHi(); 
+0

पर जाऊंगा, मैं निश्चित रूप से * करता हूं * मूल कार्य तक पहुंच है, इसलिए मुझे इसे "निजी" के बजाय चीजों को "संरक्षित" बनाने के लिए इस तरह से लिखना अच्छा लगेगा। क्या आप एक उदाहरण प्रदान कर सकते हैं? –

+0

मैं यह जोड़ना चाहता हूं कि यह "स्कोप" अंतरिक्ष का अपमानजनक है ... – gnarf

1

तुम सच में विरासत की जरूरत है, वहाँ कुछ पुस्तकालयों बेहद मदद मिलेगी रहे हैं। एक विकल्प trait.js है, जो वास्तव में किसी भी बिंदु पर जावास्क्रिप्ट का मानक हिस्सा बन सकता है। अगर वह आपकी नाव नहीं तैरता है, तो jQuery और प्रोटोटाइप जैसी पुस्तकालयों में विरासत के लिए सहायक हैं।

यदि आप न्यूनतम/से-स्क्रैच दृष्टिकोण के साथ जाना चाहते हैं, तो मैं दृढ़ता से सुझाव देता हूं कि आप सब कुछ के लिए प्रोटोटाइप मॉडल का उपयोग करें। आप अपने उदाहरणों में मौजूद पैटर्न पर एक बड़ा प्रदर्शन वृद्धि देखेंगे।

अधिक से अधिक सीधे अपने प्रश्न को संबोधित करने के लिए, नहीं। यदि आप अपनी 'कक्षाओं' को डिजाइन करते हैं तो आपके पास एक आसान समय होगा ताकि निजी कार्यों पर भरोसा न हो।

+0

मैंने वापस लौटाया jQuery.extend ({}, वेलकमर(), {sayHi: function() {चेतावनी (pSadMessage());}); ', लेकिन' विस्तार 'स्पष्ट रूप से ऑब्जेक्ट शाब्दिक में परिभाषित तत्वों की प्रतिलिपि बनाता है (सार्वजनिक तरीकों), बंद करने का दायरा नहीं। –

+0

हाँ, जिस तरह से आपने अपने "वर्ग" को कन्स्ट्रक्टर में परिभाषित निजी var/functions के साथ डिज़ाइन किया है, वे अभी दिखाई नहीं दे रहे हैं, यही कारण है कि मैं निश्चित रूप से एक और मानक प्रोटोटाइप आधारित संरचना – jdc0589

9

"वर्ग" पैटर्न नहीं एक "वर्ग" पैटर्न है कि, यह एक Module Pattern के रूप में जाना जाता है। यह उस ऑब्जेक्ट को लौटाता है जिस पर फ़ंक्शन को कोई संबंध नहीं है जो इसे अन्य बनाता है, फिर इसके निजी चर की उपलब्धता। लौटाया गया ऑब्जेक्ट उस फ़ंक्शन का उदाहरण नहीं है जिसने इसे बनाया है।

जब आप 'नई कक्षा()' कहते हैं तो यह उस फ़ंक्शन का एक उदाहरण बनाता है, लेकिन यह एक और ऑब्जेक्ट भी देता है। कोई और परिचालन वास्तव में लौटे ऑब्जेक्ट पर है, उदाहरण के लिए नहीं।

आदेश विरासत उपयोग करने के लिए, तुम सच में प्रोटोटाइप विरासत ठीक से उपयोग करने की जरूरत है, मैं आप पढ़ सकते हैं सुझाव है:

आगे पढ़ने:

पठन सामग्री के साथ छोड़ने के लिए क्षमा करें, लेकिन यह आप संभावनाओं को तलाश रहे हैं मुझे लगता है। ये लेख इस मामले पर गहरी अंतर्दृष्टि देंगे।

एक बार जब आप इस मामले पर और जान लेंगे, तो आप निजी सदस्यों को पूरी तरह से अनदेखा कर सकते हैं और _ उपसर्ग का उपयोग कर सकते हैं और इसे हर किसी की तरह सार्वजनिक सदस्य बना सकते हैं;) यह आसान और निजी सदस्य वैसे भी व्यर्थ हैं।

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