RubyのバックグラウンドからJavaScriptを学習しているので、私のコードが結果を生成できない理由を理解しています必要。私はpythontutor.comでこれを実行して何が起きているのかを段階的に見てみると、それは私の疑惑を裏付けるものです。しかし、なぜこれが当てはまるのか正確にはわかりません。JavaScriptの関数とプロトタイプ - 呼び出しメソッドによる基本的なルーティングの問題
私はサーモスタットを構築していて、温度が18dCを下回ったら 'グリーン'に戻ると思われます。最後の行でthermostat.displayColor
と呼ぶと、私の最後から二番目の行でconsole.logは17ですが、黄色と表示されます。コードはそこで終了し、私はそれが期待している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!
は、迅速な対応のためにあなたにロブをありがとう! displayColorが(初期化の時点で)1回だけ設定される理由は何か特別な理由はありますか?私はこれについてもっと詳しく知りたいと思いますが、おそらく本当に基本的なコンセプトですが、コンストラクタ関数を呼び出すインスタンスを作成するたびに、これを探し始める方法がわかりません。 – ugotchi
@ggwcそれは 'Thermostat()'関数が呼び出される唯一の時間です。したがって、 'displayColor()'は一度だけ呼び出されます。 – Sean
@ggwc問題ありません。おそらく、 'this.displayColor = this.currentColor()'は 'displayColor'の値をバインドし、その値を得るために常に' currentColor'関数を呼び出すことが何らかの形で行われると考えています。コンストラクタ( 'Thermostat(){...')は、 'new Thermostat()'をインスタンス化したときに一度呼び出され、他のメンバ関数や外部から更新されない限り、コンストラクタ内で設定した値は静的です。 –