有人能用对象解释奇怪的JavaScript吗

Can someone explain odd JavaScript with objects?

本文关键字:JavaScript 解释 对象      更新时间:2023-09-26

我有以下类

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对象,为什么我只看到更改后的值?

创建对象时,返回对象的属性"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"属性作为ES6getter函数。对"hot"属性的引用现在会导致调用这个小函数,因此该属性将提供一种检索"isHot"当前值副本的方法。(这在旧的JavaScript环境中不起作用。(

因为hot被设置为执行TempisHot的值。因为isHot是基元,所以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
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方法直接编辑对象的hot值,这意味着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.

相关文章也许。。

  • 在Javascript中实现私有实例变量

上面的答案解释了您处理源变量的副本。如果您只使用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