2016-04-11 4 views
10

पर केवल एक गेटर है, मैं पुराने ईएस 6 कक्षाओं में पुराने (फ़ंक्शंस और प्रोटोटाइप) की हैकी जावास्क्रिप्ट कक्षाओं का उपयोग करने से आगे बढ़ रहा हूं।Uncaught TypeError: संपत्ति प्लेयर सेट नहीं किया जा सकता है # में से कोई भी जो लाइन 4

मैं शायद कुछ बेवकूफ कर रहा हूँ, लेकिन मुझे यकीन है कि मैं क्यों ऐसा करने की अनुमति नहीं कर रहा हूँ नहीं कर रहा हूँ:

class Player{ 
    constructor(playerNo){ 
     this.playerNo = playerNo; 
    }  
    get playerNo(){ 
     return this.playerNo; 
    } 

    set cards(playersCards){ 
     this.cards = playersCards; 
    } 
    get cards(){ 
     return this.cards; 
    } 
} 

var steve = new Player(1); 

यह मुझे त्रुटि देता है: Uncaught TypeError: Cannot set property playerNo of # which has only a getter on line 4

तो, मैं करने की कोशिश की नीचे:

class Player{ 
    constructor(playerNo){ 
     this.playerNo = playerNo; 
    } 
    set playerNo(no){ 
     this.playerNo = no; 
    } 
    get playerNo(){ 
     return this.playerNo; 
    } 

    set cards(playersCards){ 
     this.cards = playersCards; 
    } 
    get cards(){ 
     return this.cards; 
    } 
} 

var steve = new Player(1); 

कौन सा मुझे देता है: Uncaught RangeError: Maximum call stack size exceeded on line 6 (जो लाइन this.playerNo = no; है)।

कोई विचार?

+1

आप यहां गेटर्स/सेटर्स का उपयोग क्यों कर रहे हैं? आपको उनकी आवश्यकता नहीं है। – Bergi

+2

वे अच्छे अभ्यास कर रहे हैं, है ना? इसके अलावा, मैं जल्द ही प्रमाणीकरण को लागू करने की योजना बना रहा हूं, और बिना सेटर्स के जिसमें बहुत से स्थानों में कोड बदलना शामिल होगा। उनका उपयोग करने के लिए क्या कारण हैं? – Jonah

+2

नहीं, वे अच्छे अभ्यास नहीं करते हैं जब वे कुछ भी विशेष नहीं करते हैं (और इसके अतिरिक्त, वे धीमे होते हैं)। वे सिर्फ कोड जटिल करते हैं। हां, आप उनका उपयोग कर सकते हैं * जब * आप सत्यापन लागू करते हैं, यह ठीक है, लेकिन आपको * तब * का उपयोग नहीं करना चाहिए। – Bergi

उत्तर

8

आपके पास playerNo सेटिंग के साथ रिकर्सन है।

playerNo सेटर में, this._playerNo = 0 सेट करने का प्रयास करें।

शेष कोड में, सेटटर विधि के नाम और डेटा को संग्रहीत करने वाली आंतरिक संपत्ति के बीच एक अंतर बनाना जारी रखें।

+0

पता था कि यह कुछ मूर्खतापूर्ण होगा। धन्यवाद। मुझे लगता है कि कन्स्ट्रक्टर भी 'कन्स्ट्रक्टर (प्लेयर नहीं) { यह हो सकता है ._playerNo = playerNo; } '? या क्या निर्माता को निर्माता से बुलाया जा सकता है? – Jonah

+3

मेरे पास कन्स्ट्रक्टर डिज़ाइन सीधे संपत्ति सेट करेगा। थोड़ा अधिक प्रत्यक्ष और जनता को आंतरिक संपत्ति का पर्दाफाश नहीं करता है। –

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