javascript - Javascript getter/setter 的奇怪行为

标签 javascript node.js object getter-setter

我正在尝试创建一个自动为对象的新实例定义 getters/setters 的对象。我希望 setter 将这些值放在一个名为 newValues 的单独对象属性中。为什么在下面的代码片段中设置 prop1 的值实际上设置了 newValues.prop2 的值而不是 newValues.prop1?

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

var Record = function(data) {
  this.fieldValues = {}
  this._data = data;
  var record = this;
  for(var key in data) {
    record.__defineGetter__(key, function() {
      return record._data[key];
    });
    record.__defineSetter__(key, function(val) {
      record.fieldValues[key] = val;
    });
  }
}

var myRecord = new Record({prop1: 'prop1test', prop2: 'prop2test'});

myRecord.prop1 = 'newvalue';

console.log(myRecord.fieldValues.prop1); // undefined
console.log(myRecord.fieldValues.prop2); // 'newvalue'

最佳答案

因为当您最终使用为 getter/setter 创建的函数时,key 具有其最终值。您需要为循环的每次迭代关闭 key 的值。 JavaScript 具有函数作用域,而不是 block 作用域。

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));
    }
}

关于javascript - Javascript getter/setter 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10453725/

相关文章:

javascript - 为什么 (file.lastModifiedDate == file.lastModifiedDate ) 在 JavaScript 中评估为 false?

javascript - 根据键和值对对象数组进行排序

python - 使用 __getattr__(self, name) 访问实例的其他属性

javascript - parrot 2.0 ardrone 上的 NavData,如何添加延迟并构建实时图?

javascript - 当鼠标移动到对象上时发生闪烁 - Javascript

javascript - 从 Underscore 模板调用 Angular 范围上的方法

javascript - 获取超时 - React Native

angularjs - 使用 Angular 中的 get/post 发送 header key 到 Express4 Rest api 的方法

另一个源文件中的 node.js 事件监听器

javascript - 如何隐藏某个类中没有下一个元素的元素?