2013-11-21 5 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

дубликат http://stackoverflow.com/questions/13787643/object-defineproperty-get-set-closure –

ответ

2

get и set являются функциями, что все ссылка ту же переменную, i. К тому времени, как вы вызываете функцию вне цикла, i равно 3. Когда вы используете forEach, функция, определяющая свойства, получает индекс или ключ в качестве параметра, который является другим объектом в каждом вызове.

+0

Ах да, но, конечно же! Видите, я знал, что пропустил что-то совершенно очевидное ;-) Большое спасибо! (Accept in 7 minutes) –

+0

@JeffreyW. Почти каждый делает это один раз. 'array.forEach' ftw. – sqykly

Смежные вопросы