Javascript 我不明白为什么在构造函数的执行上下文中用set属性设置一个定义的值不会改变这个值

Javascript 我不明白为什么在构造函数的执行上下文中用set属性设置一个定义的值不会改变这个值,javascript,Javascript,在下面的代码片段中,我使用在实例上定义的set函数将\u value设置为45。似乎只要我使用setValue属性,\u value就在实例上定义了,但是当我调用logValue()时,我得到了25。如果我取消注释对yo()的调用,输出将变为: 25 25 45 代码段: var构造函数=函数(){ var_值=25; constructor.yo=函数(){ console.log(_值); } constructor.prototype.logValue=函数(){ console.lo

在下面的代码片段中,我使用在实例上定义的set函数将
\u value
设置为45。似乎只要我使用
setValue
属性,
\u value
就在实例上定义了,但是当我调用
logValue()
时,我得到了25。如果我取消注释对
yo()
的调用,输出将变为:

25
25
45
代码段:
var构造函数=函数(){
var_值=25;
constructor.yo=函数(){
console.log(_值);
}
constructor.prototype.logValue=函数(){
console.log(_值);
}
defineProperty(这是“getValue”,即{get:function(){return\u value;}}});
defineProperty(这个“setValue”,{set:function(input){u value=input;}});
};
var实例=新构造函数();
var instance2=新构造函数();
instance.setValue=45;
实例logValue();
//构造函数yo();

log(instance.getValue)表示
\u value
变量是
构造函数()
函数的局部变量。每次调用
constructor()
时,都会创建该变量的新实例。现在,在该函数中,每次调用它时,都会将
yo()
函数重新创建为
constructor()
函数的属性。这意味着在第二次调用
构造函数()
时,“yo”属性的前一个值将被新函数覆盖

因此,当您通过第二个实例对象修改
\u value
时,您正在修改在对
构造函数()的第二次调用中创建的闭包中的
\u value
变量。因为只有一个“yo”属性,这就是调用它时要记录的值

如果您要创建第三个实例,您会看到相同的效果:“yo”将再次被覆盖,当通过“yo”进行查询时,该值(在更改之前)将返回默认值
25

虽然在这样的函数中设置像“yo”属性这样的属性并不是完全错误的,但在这种情况下,不清楚它实现了什么。最好将“yo”作为构造对象的属性,而不是构造函数本身


编辑-Felix Kling正确地指出,在构造函数内部的原型上重新定义
logValue()
将产生类似的(坏的)效果。

构造函数.prototype.logValue
在每次创建实例时都会重新定义,并且
logValue
总是在最后一个实例中打印
\u value

var constructor = function(val) {
  var _value = val;
  constructor.prototype.logValue = function() {
    console.log(_value);
  }
};

var instance = new constructor(30);
var instance2 = new constructor(50);
instance.setValue = 45;
instance.logValue(); // prints 50  _value from instance2
instance2.logValue();  // prints 50 _value from instance2

为什么要使用两个属性?为什么不创建一个属性
,并在同一个对象中定义getter和setter?e、 g.
Object.defineProperty(这个“值”,{get:function(){return}value;}set:function(input){u value=input;}})请注意:构造函数(>=ES6)是一个保留关键字,不应用作变量名。@Mijago得到了它,谢谢。您定义了构造函数var\u value=25;下一个在正确的运行路径上,对我来说没什么奇怪的。@evolutionxbox没有理由。
logValue
基本上也有同样的问题。谢谢你的回答。这似乎是对的。我仍在努力想办法解决这个问题。yo属性用于查看javascript的行为。@RyanWatson了解javascript需要一些时间。一个好的规则是构造函数中的代码用于初始化实例,而原型设置是独立的。新的
语法使其更易于组织。