我正在研究一个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)
答案 0 :(得分:2)
get
和set
是所有引用相同变量i
的函数。当您在循环外调用函数时,i
为3.当您使用forEach
时,定义属性的函数将索引或键作为参数获取,这是每个调用中的不同实体