Javascript getter/setter的奇怪行为

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。我希望setter将这些值放在一个单独的对象属性newValues中。为什么在下面的代码段中设置prop1的值实际上设置了newValues.prop2的值而不是newValues.prop1的值

我是在做傻事吗?这完全有可能,因为我只睡了几个小时…:)


因为当您最终使用为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));
    }
}