我有以下课程
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对象,为什么我只看到更改的值?
答案 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
被设置为执行isHot
时Temp
的值。由于isHot
是primitive,因此w.hot
的值是isHot
的副本,而不是对当前值的引用isHot
值得指出的是,如果您计划创建Temp
的多个实例,这是一种可怕的模式,因为isHot
是Temp
的局部变量,而不是实例变量从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