JavaScript动态定义属性

时间:2013-11-21 18:36:18

标签: javascript

我正在研究一个JS框架并遇到了一些奇怪的东西(或者我完全没有看到)

我使用Object.defineProperty定义对象的属性。但是,在for循环中使用它会产生一些时髦的值。不知何故,添加的最后一个属性将始终是指定的值。例如,如果我为属性one指定了内容,则会将其分配给属性three。这是一个例子(这里是一个小提琴http://jsfiddle.net/5xLdC/

var Test = function(){};
var props = ['one', 'two', 'three'];
for(var i = 0; i < props.length; i++) {
  Object.defineProperty(Test.prototype, props[i], {
    get: function() {
      return this['_'+props[i]];
    },
    set: function(val) {
      this['_'+props[i]] = val;
    }
  });
}
var test = new Test();
test.one = 'one';
console.log(test.three) // => 'one'

如果我将它包装在forEach循环中,它的效果非常好。我猜的是,由于范围错误,我们都拥有相同的get / set函数(就我而言?)。

有人可以解释为什么会这样吗?

编辑:

也可以使用IIFE来解决:

get:(function(y) {
   return function() { return this['_'+props[y]]; }
})(i)

1 个答案:

答案 0 :(得分:2)

getset是所有引用相同变量i的函数。当您在循环外调用函数时,i为3.当您使用forEach时,定义属性的函数将索引或键作为参数获取,这是每个调用中的不同实体