Я работаю над рамкой 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)
дубликат http://stackoverflow.com/questions/13787643/object-defineproperty-get-set-closure –