Javascript 我不明白为什么在构造函数的执行上下文中用set属性设置一个定义的值不会改变这个值
在下面的代码片段中,我使用在实例上定义的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
\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需要一些时间。一个好的规则是构造函数中的代码用于初始化实例,而原型设置是独立的。新的类
语法使其更易于组织。