Javascript函数和原型-通过调用方法的基本路由问题

Javascript函数和原型-通过调用方法的基本路由问题,javascript,function,prototype,Javascript,Function,Prototype,我即将从Ruby背景学习JavaScript,因此我在理解(并用文字表达)为什么我的代码无法产生我需要的结果方面遇到了一些困难。我在pythontutor.com上运行了这个程序,以查看正在发生的事情的一步一步的演练,它证实了我的怀疑。然而,我不确定为什么会这样 我正在建造一个恒温器,一旦温度低于18摄氏度,它就会返回“绿色”。在倒数第二行,console.log是17,这是正确的,但是当我调用恒温器.displayColor时,最后一行仍然显示黄色。代码在这里终止,并且不会返回到我所期望的th

我即将从Ruby背景学习JavaScript,因此我在理解(并用文字表达)为什么我的代码无法产生我需要的结果方面遇到了一些困难。我在pythontutor.com上运行了这个程序,以查看正在发生的事情的一步一步的演练,它证实了我的怀疑。然而,我不确定为什么会这样

我正在建造一个恒温器,一旦温度低于18摄氏度,它就会返回“绿色”。在倒数第二行,console.log是17,这是正确的,但是当我调用
恒温器.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!
var默认值_TEMP=20;
函数恒温器(){
this.temperature=默认温度;
这是maxTemp=25;
this.powerMode='on';
this.displayColor=this.currentColor()
};
automator.prototype.downButton=函数(){
如果(此温度===10){
抛出新错误(“温度不能低于10dC”);
};
这个温度--;
};
恒温器.prototype.currentColor=函数(){
如果((此温度>=18)和&(此温度<25)){
返回“黄色”
} 
否则,如果(该温度<18){
返回“绿色”
}
否则{
返回“红色”
}
};
var恒温器=新恒温器();

对于(var i=1;i您应该调用
currentColor()
方法,
displayColor
仅在构造函数中设置(此时温度为20),并且不会在温度变化时更新

将颜色设置添加到
下拉按钮
方法可能有意义:

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

正如Rob所说,您应该调用计算当前颜色的函数。以下是他的建议以及对代码的一些改进:

函数恒温器(){
这个最小温度=10;
这个最大温度=25;
这个温度=20;
}
恒温器.prototype.decreaseTemp=功能(){
如果(this.temperature>this.MIN_TEMP)this.temperature--;
};
恒温器.prototype.increaseTemp=函数(){
如果(此温度<此最高温度)此温度++;
};
恒温器.prototype.currentColor=函数(){
如果(该温度<18)返回“绿色”;
如果(该温度<25)返回“黄色”;
返回“红色”;
};
var恒温器=新恒温器();

对于(var i=1;感谢Rob的快速响应!对于displayColor只设置一次(在初始化时)有什么特殊原因吗?我想了解更多关于这方面的信息,这可能是一个非常基本的概念,但我不确定如何开始寻找this@ggwc无论何时创建实例,您都在调用构造函数。这是唯一一次调用
automator()
函数,因此
displayColor()
仅被调用once@ggwc没问题。也许您认为
this.displayColor=this.currentColor()
会以某种方式绑定
displayColor
的值,它总是调用
currentColor
函数来获取其值,但事实并非如此。构造函数(
函数()当您实例化
新的恒温器()
时,{…
)被调用一次,并且您在构造函数中设置的值是静态的,除非由其他成员函数或外部更新。