2016-02-17 5 views
5

मैं रूबी पृष्ठभूमि से जावास्क्रिप्ट सीखने के लिए आ रहा हूं, इसलिए मुझे कुछ परेशानी हो रही है (और इसे शब्दों में डालने) क्यों मेरा कोड परिणाम उत्पन्न करने में विफल रहा है I जरुरत। मैंने यह क्या किया है, इसके चरण-दर-चरण चलने के लिए pythontutor.com पर चलाया, और यह मेरे संदेह की पुष्टि करता है। हालांकि, मुझे यकीन नहीं है कि यह मामला क्यों है।जावास्क्रिप्ट फ़ंक्शन और प्रोटोटाइप - कॉलिंग विधियों के माध्यम से मूल रूटिंग समस्या

मैं थर्मोस्टेट का निर्माण कर रहा हूं, और तापमान 18 डीसी से कम होने के बाद इसे 'हरा' वापस करने वाला माना जाता है। मेरी अंतिम रेखा पर, console.log 17 है जो सही है, हालांकि जब मैं अंतिम पंक्ति पर thermostat.displayColor पर कॉल करता हूं तो यह अभी भी पीला कहता है। कोड वहाँ समाप्त हो जाता है, और this.displayColor = this.currentColor() के माध्यम से वापस जाने के लिए नहीं है जो मैं करने के लिए यह उम्मीद (क्योंकि यह पहली बार चलाने पर ऐसा किया 'पीला' के रूप में शुरू करने रंग को परिभाषित करने के।

कोड सही ढंग से काम करता है और रिटर्न 'हरित' अगर मैं सीधे प्रोटोटाइप विधि this.currentColor() पर कॉल करने के लिए कोड बदलता हूं, हालांकि मैं सिर्फ यह जानना चाहता हूं कि यह मुझे नीचे लिखने के तरीके में क्यों नहीं दे रहा है।

मुझे यह वर्णन करने के लिए शब्दावली के बारे में निश्चित नहीं है समस्या, इसलिए मेरे शीर्षक के लिए अग्रिम में माफी नहीं है।

var DEFAULT_TEMP = 20; 

function Thermostat(){ 
    this.temperature = DEFAULT_TEMP; 
    this.maxTemp = 25; 
    this.powerMode = 'on'; 
    this.displayColor = this.currentColor() 
}; 

Thermostat.prototype.downButton = function(){ 
    if (this.temperature === 10){ 
    throw new Error('temp cannot be lower than 10dC'); 
    }; 
    this.temperature --; 
}; 

Thermostat.prototype.currentColor = function() { 
    if ((this.temperature >= 18) && (this.temperature < 25)) { 
    return 'yellow' 
    } 
    else if (this.temperature < 18) { 
    return 'green' 
    } 

    else { 
    return 'red' 
    } 
}; 

var thermostat = new Thermostat(); 
for (var i = 1; i <= 3; i++) { 
     thermostat.downButton(); 
     }; 
console.log("spec file test green, temp should be 17 and is:" + thermostat.temperature) 
console.log(thermostat.displayColor); //this should be green, but it is yellow! 

उत्तर

3

आपको कॉल करना चाहिए currentColor() विधि, displayColor केवल निर्माता में सेट है (जिस समय तापमान 20 है) और तापमान में परिवर्तन होने पर अपडेट नहीं किया जाता है।

यह downButton विधि करने के लिए रंग सेटिंग जोड़ने के लिए कोई मतलब हो सकता है:

Thermostat.prototype.downButton = function(){ 
    if (this.temperature === 10){ 
    throw new Error('temp cannot be lower than 10dC'); 
    }; 
    this.temperature --; 
    this.displayColor = this.currentColor(); 
}; 
+0

त्वरित प्रतिक्रिया के लिए आप रोब धन्यवाद! क्या डिस्प्ले कलर केवल एक बार (प्रारंभिक बिंदु पर) क्यों सेट किया गया है इसका कोई विशेष कारण है? मैं इसके बारे में अधिक पढ़ना चाहता हूं, शायद यह वास्तव में एक मौलिक अवधारणा है, लेकिन मुझे यकीन नहीं है कि इस – ugotchi

+1

@ggwc को जब भी आप निर्माता बनाते हैं तो आप कन्स्ट्रक्टर फ़ंक्शन को कॉल कर रहे हैं। यही एकमात्र समय है कि 'थर्मोस्टेट()' फ़ंक्शन को इसलिए 'डिस्प्ले कॉलर()' कहा जाता है जिसे केवल – Sean

+1

@ggwc कोई समस्या नहीं कहा जाता है। शायद आप सोच रहे हैं कि 'this.displayColor = this.currentColor() 'किसी भी तरीके से' displayColor' के मान को बाध्य करेगा कि यह हमेशा 'वर्तमान रंग' फ़ंक्शन को अपना मान प्राप्त करने के लिए कहता है, लेकिन ऐसा नहीं होता है। कन्स्ट्रक्टर ('फ़ंक्शन थर्मोस्टेट() {...') को एक बार कहा जाता है जब आप 'थर्मोस्टेट()' को तत्काल बनाते हैं और कन्स्ट्रक्टर के भीतर सेट किए गए मान स्थिर होते हैं जब तक कि अन्य सदस्य फ़ंक्शंस या बाहरी रूप से अपडेट नहीं किया जाता है। –

2

रोब कहते हैं, तो आप समारोह है कि वर्तमान रंग की गणना करता है फोन करना चाहिए। यहाँ अपने कोड में कुछ सुधार के साथ-साथ उनके सुझाव है:

function Thermostat() { 
 
    this.MIN_TEMP = 10; 
 
    this.MAX_TEMP = 25; 
 
    this.temperature = 20; 
 
} 
 

 
Thermostat.prototype.decreaseTemp = function() { 
 
    if (this.temperature > this.MIN_TEMP) this.temperature--; 
 
}; 
 
Thermostat.prototype.increaseTemp = function() { 
 
    if (this.temperature < this.MAX_TEMP) this.temperature++; 
 
}; 
 
Thermostat.prototype.currentColor = function() { 
 
    if (this.temperature < 18) return 'green'; 
 
    if (this.temperature < 25) return 'yellow'; 
 
    return 'red'; 
 
}; 
 

 
var thermostat = new Thermostat(); 
 
for (var i = 1; i <= 3; i++) { 
 
    thermostat.decreaseTemp(); 
 
} 
 

 
// no errors mean all assertions pass 
 
thermostat.temperature.should.equal(17); 
 
thermostat.currentColor().should.equal('green');
<script src="https://cdnjs.cloudflare.com/ajax/libs/should.js/8.2.2/should.min.js"></script>

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