Mi sto avvicinando all'apprendimento di JavaScript da uno sfondo di Ruby, quindi ho difficoltà a capire (e a metterlo in parole) perché il mio codice non riesce a produrre i risultati bisogno. Ho eseguito questo a pythontutor.com per vedere una procedura dettagliata di cosa sta succedendo, e conferma i miei sospetti. Tuttavia, non sono sicuro del perché questo sia il caso.Funzione Javascript e prototipo - problema di routing di base tramite metodi di chiamata
Sto costruendo un termostato e si suppone che restituisca 'verde' una volta che la temperatura è inferiore a 18dC. Sulla mia penultima riga, il console.log è 17, che è corretto, tuttavia quando chiamo thermostat.displayColor
sull'ultima riga, si dice ancora giallo. Il codice termina lì e non torna indietro attraverso this.displayColor = this.currentColor()
che mi aspetto (poiché lo ha eseguito alla prima esecuzione per definire il colore iniziale come 'giallo'.
Il codice funziona correttamente e restituisce 'verde' se cambio il codice per chiamare direttamente il metodo prototipo this.currentColor()
, tuttavia voglio solo sapere perché non mi permette di farlo nel modo in cui ho scritto qui sotto.
Non sono sicuro della terminologia per descrivere questo problema, quindi scusate in anticipo per il mio titolo non accurato
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!
grazie Rob per la rapida risposta! C'è qualche ragione particolare per cui il displayColor viene impostato una sola volta (al momento dell'inizializzazione)? Mi piacerebbe leggere di più su questo, è probabilmente un concetto davvero fondamentale, ma non sono sicuro di come iniziare a cercare questo – ugotchi
@ggwc ogni volta che crei l'istanza che stai chiamando la funzione di costruzione. Questa è l'unica volta in cui viene chiamata la funzione 'Termostato()' perciò 'displayColor()' viene chiamato solo una volta – Sean
@ggwc Nessun problema. Forse stai pensando che 'this.displayColor = this.currentColor()' legherà il valore di 'displayColor' in qualche modo che chiama sempre la funzione' currentColor' per ottenere il suo valore, ma non è quello che succede. Il costruttore ('function Thermostat() {...') è chiamato una volta quando istanziate 'new Thermostat()' ei valori impostati all'interno del costruttore sono statici, a meno che non vengano aggiornati da altre funzioni membro o esternamente. –