सामान्य रूप से, यह अतिरिक्त कोड के बिना काम करेगा; माता-पिता निर्माता जब तक स्पष्ट अधिरोहित प्रयोग किया जाता है:
class A
constructor: ->
console.log arg for arg in arguments
class B extends A
new B('foo') # output: 'foo'
और समस्या नहीं है कि सरणी एक constructor
विधि नहीं है:
coffee> Array.constructor
[Function: Function]
समस्या सिर्फ इतना है कि Array
है सिर्फ सादा अजीब है। जबकि सरणी सिद्धांत रूप में "केवल वस्तुएं" हैं, अभ्यास में वे अलग-अलग संग्रहित होते हैं। तो जब आप उस कन्स्ट्रक्टर को उस ऑब्जेक्ट पर लागू करने का प्रयास करते हैं जो एक सरणी नहीं है (भले ही यह instanceof Array
परीक्षण पास हो), यह काम नहीं करता है।
तो, आप एकोर्न के समाधान का उपयोग कर सकते हैं, लेकिन फिर आप सड़क के नीचे अन्य समस्याओं में भाग ले सकते हैं (विशेष रूप से यदि आप List
को किसी वास्तविक सरणी की अपेक्षा करते हैं)। इसी कारण से, मैं एक देशी ऑब्जेक्ट प्रकार से विरासत का उपयोग करने की कोशिश करने के बजाय, एक सरणी उदाहरण के चारों ओर एक रैपर के रूप में List
को लागू करने की अनुशंसा करता हूं।
हम विषय पर हैं, तब एक बहुत महत्वपूर्ण स्पष्टीकरण: यदि आप अपने आप में super
उपयोग करते हैं, कि सभी तर्कों पास करता है! यह व्यवहार रुबी से उधार लिया जाता है। तो
class B extends A
constructor: ->
super
', रों निर्माता जबकि
class B extends A
constructor: ->
super()
A
लागू करेगा' A
के सभी तर्कों साथ भेज देते हैं कोई तर्क के साथ रों निर्माता होंगे।
स्रोत
2011-05-10 19:37:00
नहीं यह दो अलग में इस सवाल को विभाजित करने के अच्छा नहीं होगा; सुपर के लिए कन्स्ट्रक्टर तर्कों के सामान्य उत्तीर्ण होने के लिए पहला, दूसरा 'अरे' के अजीब व्यवहार के बारे में दूसरा? – Mitja