为对象中的所有属性设置javascript

为对象中的所有属性设置javascript,javascript,getter-setter,defineproperty,Javascript,Getter Setter,Defineproperty,我正在尝试构建一个方法,该方法将在对象中的所有属性上自动创建get和set函数。理想情况下,当有人更新对象中的属性时,我希望触发接口中的脏数据进行更新 问题:在对象的属性中循环时,最后一个属性的set函数似乎应用于所有以前的属性。我不明白为什么会发生这种情况,因为属性在每个实例中都是唯一的(我已经基于原始属性名创建了一个_-prop版本) 我用一些基本的代码创建了一个小提琴。 这里是那些非小提琴手的代码;这一个有控制台命令,显示正在设置的_prop值。奇怪 var超级英雄={ id:0, 名

我正在尝试构建一个方法,该方法将在对象中的所有属性上自动创建get和set函数。理想情况下,当有人更新对象中的属性时,我希望触发接口中的脏数据进行更新

问题:在对象的属性中循环时,最后一个属性的set函数似乎应用于所有以前的属性。我不明白为什么会发生这种情况,因为属性在每个实例中都是唯一的(我已经基于原始属性名创建了一个_-prop版本)

我用一些基本的代码创建了一个小提琴。

这里是那些非小提琴手的代码;这一个有控制台命令,显示正在设置的_prop值。奇怪

var超级英雄={
id:0,
名字:“鸭子”,
姓氏:“黑暗”
};
对于(超级英雄中的属性)
{
var propertyName=property.toString();
//在使用get/set覆盖初始值之前,将其存储在“\u var”中
这个[''属性名称]=超级英雄[属性];
Object.defineProperty(超级英雄、propertyName、{
设置:函数(值){
此[''属性名称]=值;
},
get:function(){
返回此[''属性名称];
}
});
}
log('--测试的初始值---');
控制台日志(超级英雄);
console.log('--------------------------------------');
superhero.firstname='Kal';
superhero.lastname='El';
console.log(superhero.firstname+''+superhero.lastname)您需要更改

var propertyName = property.toString();

否则,每当您更新
propertyName
时,它将更改所有属性的属性,因为
var
创建的范围仅允许单个引用(功能范围),而如果您使用
let
创建它,则每个循环步骤将有自己的引用(块范围)

var超级英雄={
id:0,
名字:“鸭子”,
姓氏:“黑暗”
};
对于(超级英雄中的属性)
{
让propertyName=property.toString();
//在使用get/set覆盖初始值之前,将其存储在“\u var”中
这个[''属性名称]=超级英雄[属性];
Object.defineProperty(超级英雄、propertyName、{
设置:函数(值){
此[''属性名称]=值;
},
get:function(){
返回此[''属性名称];
}
});
}
log('--测试的初始值---');
控制台日志(超级英雄);
console.log('--------------------------------------');
superhero.firstname='Kal';
superhero.lastname='El';

console.log(superhero.firstname+''+superhero.lastname)
var
在功能上是有范围的,因此在您的示例中,properyName在循环后总是等于
lastName
。Man。。。不真实,我花了四个小时绞尽脑汁在这个问题上,而你却在30秒内解决了它。你。是令人惊叹的!果然。。。更改三个字符将生成预期的输出。我仍然在思考你提到的范围问题,但我想现在我知道了它是什么,我可以再花些时间来更好地理解它。再次感谢!
let propertyName = property.toString();