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

Joh*_*röm 6 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()
Run Code Online (Sandbox Code Playgroud)

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

Poi*_*nty 9

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

JavaScript没有提供使变量或对象属性成为另一个的别名的方法.但是,你可以做的是返回一个更有趣的对象:

function Temp() { 
  var isHot=false; 
  return { 
    setHot: function(v) { isHot=v }, 
    getHot: function() { return isHot; },
    get hot() { return isHot; }
  }
}
Run Code Online (Sandbox Code Playgroud)

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


Emi*_*ile 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()
Run Code Online (Sandbox Code Playgroud)

我相信,这就是您需要做的才能使其发挥作用。根本不需要 isHot 变量。然后 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.
Run Code Online (Sandbox Code Playgroud)

相关文章也许..