有人可以用对象解释奇怪的JavaScript吗?

时间:2015-08-27 12:40:15

标签: javascript

我有以下课程

function Temp() { 
  var isHot=false; 
  return { 
    setHot: function(v) { isHot=v }, 
    getHot: function() { return isHot; },
    hot: isHot
  }
}
var w = new Temp();
w.setHot(true);

w.hot !== w.getHot()

如果通过函数访问w对象,为什么我只看到更改的值?

4 个答案:

答案 0 :(得分:9)

该物业" hot"在创建对象时,返回的对象的已初始化,但它的值是" isHot"的值的副本。对本地(闭包)变量的后续更改" isHot"不会影响" hot"属性;这根本不是变量和对象属性的工作方式。

JavaScript并没有提供一种方法来使变量或对象属性成为另一个属性的别名。然而,你可以做的事情会返回一个更有趣的对象:

function Temp() { 
  var isHot=false; 
  return { 
    setHot: function(v) { isHot=v }, 
    getHot: function() { return isHot; },
    get hot() { return isHot; }
  }
}

这创造了" hot"属性作为ES6 getter 函数。对" hot"的引用property现在导致调用很少的函数,因此该属性将提供一种方法来检索" isHot"的当前值的副本。 (这不适用于较旧的JavaScript环境。)

答案 1 :(得分:4)

因为hot被设置为执行isHotTemp的值。由于isHotprimitive,因此w.hot的值是isHot的副本,而不是对当前值的引用isHot

值得指出的是,如果您计划创建Temp的多个实例,这是一种可怕的模式,因为isHotTemp的局部变量,而不是实例变量从new Temp()

创建的对象
var x1 = new Temp();
var x2 = new Temp();
x2.setHot(false);
x1.setHot(true);
x1.getHot() === true; //will return true

答案 2 :(得分:3)

function Temp() { 
  return { 
    setHot: function(v) { this.hot=v }, 
    getHot: function() { return this.hot; },
    hot: false
  }
}
var w = new Temp();
w.setHot(true);

w.hot !== w.getHot()

我相信,这是你需要做的工作。根本不需要isHot var。 get set方法然后直接编辑对象热值,这意味着getHot()和w.hot都将返回正确的值。

如果你想将isHot值设为私有,那么我相信你需要使用isHot var,但你根本不需要或引用w.hot值。不确定这种行为的后果是什么。

function Temp() { 
var isHot = false;
  return { 
    setHot: function(v) { isHot=v }, 
    getHot: function() { return isHot; }
  }
}
var w = new Temp();
w.setHot(true);
w.getHot();

However you can not access w.isHot, essentially private var.

相关文章也许..

答案 3 :(得分:1)

上述答案解释了您处理源变量的副本。如果你只使用get / set函数来获取或设置闭包中的变量值,保留isHot作为私有变量,那将是一个很好的基调:

function Temp() { 
  var isHot=false; 
  return { 
    setHot: function(v) { isHot=v }, 
    getHot: function() { return isHot; }
  }
}
var w = new Temp();
w.setHot(true);

w.getHot(); // always returns the right value