2013-11-21 42 views
0

我工作的一个JS框架和跨一个奇怪的现象来(或我完全缺少明显)JavaScript的动态定义属性

我使用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

duplicate http://stackoverflow.com/questions/13787643/object-defineproperty-get-set-closure –

回答

2

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

+0

啊,是的,但当然!看,我知道我错过了完全明显的东西;-)非常感谢! (在7分钟内接受) –

+0

@JeffreyW。几乎每个人都这样做一次。 'array.forEach' ftw。 – sqykly