2008-10-23 13 views
6

मुझे स्टीव येगेज Prototype Pattern example पसंद है और अवधारणा उदाहरण के त्वरित प्रमाण को चाबुक करने का फैसला किया है।येगेज प्रोटोटाइप पैटर्न उदाहरण उदाहरण चर को कैसे संभालता है?

हालांकि, मैंने वास्तव में चीजों को नहीं सोचा था। हालांकि यह वस्तुओं के व्यवहार को गतिशील रूप से निर्दिष्ट करने के लिए बहुत अच्छा है और स्टीव के opinionated elf उदाहरण के लिए एक आसान समाधान है, उदाहरण के लिए, मैं अभी भी आवृत्ति चर को संभालने का सबसे अच्छा तरीका बनाने की कोशिश कर रहा हूं।

उदाहरण के लिए, मान लें कि मेरे पास एक AwesomeDragon ऑब्जेक्ट है। मैं फिर एक AwesomeDragonImmuneToFire ऑब्जेक्ट बनाना चाहता हूं, इसलिए मैं AwesomeDragon (AwesomeDragonImmuneToFire को AwesomeDragon से गुणों को विरासत में मिलाता है) और 'डाल' 'इम्यूनोफायर "को' सत्य 'के मूल्य के साथ एक संपत्ति के रूप में एक नया बच्चा बना देता हूं। अब तक सब ठीक है। अब मान लें कि मैं अपने AwesomeDragon ऑब्जेक्ट को पास के किसान गांवों के दौरे पर भेजना चाहता हूं। इसमें AwesomeDragon की 'स्थिति' प्रॉपर्टी को अपडेट करना शामिल होगा। हालांकि, जिस क्षण मैं यह करता हूं वह बहुत बढ़िया ड्रैगन ImmuneToFire भी बंद हो जाएगा।

ऑब्जेक्ट निर्माण पर उदाहरण मानों को ओवरराइड करने का सबसे अच्छा समाधान है उदा। 'स्थिति' के वर्तमान 'get' मान पर AwesomeDragonImmuneToFire पर तुरंत 'स्थिति' मान डाल दें?

उत्तर

10

क्या यह इस बात पर निर्भर नहीं है कि आप वास्तव में अपने सिस्टम में विरासत को कैसे लागू करते हैं?

उदाहरण के लिए, तुम क्या वर्णन के एक जावास्क्रिप्ट संस्करण में, AwesomeDragonImmuneToFire के लिए prototype सामान्य रूप से एक AwesomeDragon के उदाहरण होगा, और आप हमेशा उदाहरणों के साथ काम करने के बाद से होगी, इससे कोई फर्क नहीं होता कि आप क्या करते किसी विशेष AwesomeDragon रहे हैं:

function Dragon() 
{ 
    this.position = "starting point"; 
} 

function AwesomeDragon() 
{ 
    this.awesome = true; 
} 
AwesomeDragon.prototype = new Dragon(); 

function AwesomeDragonImmuneToFire() 
{ 
    this.immuneToFire = true; 
} 
AwesomeDragonImmuneToFire.prototype = new AwesomeDragon(); 

>>> var awesome = new AwesomeDragon(); 
>>> var immune = new AwesomeDragonImmuneToFire(); 
>>> awesome.position = "flying above village"; 
>>> immune.position; 
"starting point" 
>>> immune.awesome 
true 

इस उदाहरण में, वहाँ कोई वर्ग हैं और सभी उदाहरणों सिर्फ Object के उदाहरण जो पता करने के लिए जो समारोह उन्हें निर्माण करने के लिए इस्तेमाल किया गया था हो रहे हैं। new सिर्फ a bit of syntactic sugar है और कन्स्ट्रक्टर फ़ंक्शंस के लिए स्टडीली कैप्स का उपयोग केवल उन कार्यों के लिए एक सम्मेलन है जिनका उपयोग new के साथ किया जाना है।

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

https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Details_of_the_Object_Model

+0

मैंने सोचा था कि प्रोटोटाइप का विचार यह था कि कोई वास्तविक वर्ग नहीं था - केवल प्रोटोटाइप वर्ग के उदाहरण थे। हाइब्रिड सिद्धांत ठीक काम कर सकता है मुझे लगता है लेकिन मुझे चिंता है कि फिर आपको ऑब्जेक्ट विधियों और प्रोटोटाइप गुणों की जांच करने के लिए मजबूर होना पड़ता है। –

+0

रास्ते से प्रतिक्रिया के लिए धन्यवाद - मुझे आपका उदाहरण पसंद है और ऊपर उठाया गया है। –

+0

वास्तव में केवल उदाहरण हैं। हालांकि, प्रोटोटाइप के रूप में उपयोग किए जाने वाले Awesome का उदाहरण और वर्लफ़्लो में उपयोग किए जाने वाले Awesome के उदाहरण अलग-अलग हो सकते हैं उदाहरण के लिए –

1

यह AwesomeDragon की 'स्थिति' संपत्ति को अद्यतन करने के शामिल होगी। हालांकि, जिस क्षण मैं यह करता हूं वह बहुत बढ़िया ड्रैगन ImmuneToFire भी बंद हो जाएगा।

शायद मैं गलत समझता हूं लेकिन मुझे यकीन नहीं है कि आपको लगता है कि AwesomeDragonImmuneToFire भी क्यों बंद होगा। यदि वे दो अलग-अलग वस्तुएं हैं और स्थिति वस्तुओं की एक संपत्ति है तो प्रत्येक उदाहरण (ड्रैगन) की अपनी स्थिति होगी। एक ड्रैगन की स्थिति बदलने से दूसरे की स्थिति प्रभावित नहीं होनी चाहिए।

+1

प्रोटोटाइप पैटर्न गुणों में मूल वस्तु से प्राप्त होता है।तो जब तक मैं AwesomeDragonImmuneToFire के लिए कोई स्थिति परिभाषित नहीं करता, यह AwesomeDragon की स्थिति को विरासत में ले जाता है। –

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