Javascript getter/setter的奇怪行为
我试图创建一个对象,该对象为对象的新实例自动定义getter/setter。我希望setter将这些值放在一个单独的对象属性newValues中。为什么在下面的代码段中设置prop1的值实际上设置了newValues.prop2的值而不是newValues.prop1的值 我是在做傻事吗?这完全有可能,因为我只睡了几个小时…:)Javascript getter/setter的奇怪行为,javascript,node.js,object,getter-setter,Javascript,Node.js,Object,Getter Setter,我试图创建一个对象,该对象为对象的新实例自动定义getter/setter。我希望setter将这些值放在一个单独的对象属性newValues中。为什么在下面的代码段中设置prop1的值实际上设置了newValues.prop2的值而不是newValues.prop1的值 我是在做傻事吗?这完全有可能,因为我只睡了几个小时…:) 因为当您最终使用为getter/setter创建的函数时,key有其最终值。对于循环的每次迭代,您需要关闭key的值。JavaScript具有功能范围,而不是块范围 v
因为当您最终使用为getter/setter创建的函数时,
key
有其最终值。对于循环的每次迭代,您需要关闭key
的值。JavaScript具有功能范围,而不是块范围
var Record = function(data) {
var key;
this.fieldValues = {}
this._data = data;
for(key in data) {
//closure maintains state of "key" variable
//without being overwritten each iteration
(function (record, key) {
record.__defineGetter__(key, function() {
return record._data[key];
});
record.__defineSetter__(key, function(val) {
record.fieldValues[key] = val;
});
}(this, key));
}
}
这是人们在使用JS时遇到的常见问题:循环中的闭包问题
这很好地解释了这一点,并提供了一个解决方案:非常感谢。愚蠢的错误。
var Record = function(data) {
var key;
this.fieldValues = {}
this._data = data;
for(key in data) {
//closure maintains state of "key" variable
//without being overwritten each iteration
(function (record, key) {
record.__defineGetter__(key, function() {
return record._data[key];
});
record.__defineSetter__(key, function(val) {
record.fieldValues[key] = val;
});
}(this, key));
}
}