2011-12-02 21 views
11

मैं कर रहा हूँ नई CoffeeScript (और नहीं बल्कि जे एस के साथ अनुभवहीन भी, अगर यह अनुभवहीन है, तो माफ करना) करने के लिए और मैं नीचे के रूप में एक वर्ग बनाने के लिए कोशिश कर रहा था:CoffeeScript कक्षा सदस्य

class Test 
    a: [] 

    make: -> 
     @a.push ['A', 'B', 'C'] 

    getdata: -> 
     output = "" 
     for i in @a 
      output += i 
     output 

b = new Test 
b.make() 

alert(b.getdata()) 


c = new Test 
c.make() 

alert(c.getdata()) 

उत्पादन मैं मिलता है: "ए, बी, सी ' ' ए, बी, सी, ए, बी, सी '

के बावजूद' टेस्ट 'का एक नया उदाहरण बनाने के; सरणी संलग्न हो जाती है और साफ़ नहीं होती है। मुझसे यहां क्या गलत हो रहा है? क्या मैं सदस्य चर को गलत कर रहा हूं?

+3

आपको देखना चाहिए कि प्रोटोटाइप कैसे काम करता है, और जावास्क्रिप्ट जेनरेट कोड देखें। मुझे कॉफ़ीस्क्रिप्ट में बहुत सारी गलती दिखाई देती है (यहां तक ​​कि ट्यूटोरियल/कुकबुक में भी)। मैं जिस नियम का उपयोग करता हूं वह वर्ग सदस्यों में केवल फ़ंक्शंस और स्थिर प्रोपरीज को परिभाषित करना है (मैं @Member सिंटैक्स के साथ कन्स्ट्रक्टर में इंस्टेंस गुण परिभाषित करता हूं)। और हां यह कीवर्ड क्लास कॉफ़ीस्क्रिप्ट उपयोग के कारण थोड़ी उलझन में है। – Guillaume86

+3

साइड नोट: 'getdata: -> @ a.join ('') ' – tokland

+0

धन्यवाद Guillaume86 और टोकलैंड। मैंने इससे बहुत कुछ सीखा। – Anoop

उत्तर

23

जब आप a: [] परिभाषित करते हैं, तो आप कक्षा प्रोटोटाइप पर एक एकल सरणी वस्तु बना रहे हैं। आपके द्वारा बनाए गए वर्ग के प्रत्येक उदाहरण में यह वही सरणी वस्तु होगी। जब भी एक उदाहरण मान को संशोधित करता है, तो परिवर्तन अन्य सभी के लिए दृश्यमान होता है।

ध्यान दें कि यह केवल तभी मामला है यदि आप एक मान को संशोधित करते हैं, जैसे किसी सरणी में आइटम जोड़कर। यदि आप मान को प्रतिस्थापित करते हैं, उदाहरण के लिए एक नई सरणी निर्दिष्ट करके, यह केवल वर्तमान उदाहरण को प्रभावित करेगा।

आप एक संपत्ति है कि एक प्रति उदाहरण आधार आप constructor में इसे परिभाषित करने चाहिए, पर प्रारंभ करते समय, उदाहरण बनाने से चाहते हों:

class Test 
    constructor: -> 
     @a = [] 
     @a.push ['A', 'B', 'C'] 

    getdata: -> 
     output = "" 
     for i in @a 
      output += i 
     output 

b = new Test 

alert(b.getdata()) 


c = new Test 

alert(c.getdata()) 

Try this out और आप पाएंगे कि यह की तरह काम करता तुम्हें चाहिए।

+1

कोई आश्चर्य नहीं कि लोग इस तरह की चीजें देखते समय भ्रमित हो जाते हैं: http://coffeescriptcookbook.com/chapters/classes_and_objects/chaining – Guillaume86

+0

धन्यवाद! अब मुझे समझ आई। मुझे और भी भ्रमित कर दिया गया था व्यवहार में बदलाव/परिवर्तन अंतर। अब यह भी मंजूरी दे दी है। सहायता के लिए धन्यवाद। – Anoop

+0

यह बुरी सलाह भी यहां दोहराई गई है http://arcturo.github.io/library/coffeescript/03_classes.html और मैं लगभग उसी जाल में गिर गया। मेरी इच्छा है कि कॉफ़ीस्क्रिप्ट दस्तावेज़ इस पर सलाह देंगे। – aaron