2013-11-21 3 views
0

은 내가 JS 프레임 워크에 노력하고 뭔가 이상한 우연히 (또는 나는 완전히 명백한 누락)자바 스크립트를 동적으로 정의 속성

나는 Object.defineProperty를 사용하여 객체에 속성을 정의하고있다. 그러나 for 루프 내에서 이것을 사용하면 펑키 한 값을 얻을 수 있습니다. 어떻게 든 마지막으로 추가 된 속성은 항상 할당 된 값이됩니다. 예를 들어, 어떤 속성을 one에 할당하면 three 속성에 할당됩니다. 여기 예제 (그리고 여기에 바이올린 http://jsfiddle.net/5xLdC/이다) 나는 그것을 완벽하게 정상적으로 작동 forEach 루프에서이 작업을 마무리하려는 경우

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' 

. 내가 추측하는 바는 스코프 오류로 인해 모두 동일한 기능을 보유하고 있다는 것입니다 (내 부분에서는?). get/set

왜 이런 일이 발생하는지 설명 할 수 있습니까?

EDIT :

또한

이 가능 IIFE 로모그래퍼 해결 :

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

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

답변

2

getset 함수임을 모든 참조 동일한 변수 i. 루프 외부에서 함수를 호출 할 때 i은 3입니다. forEach을 사용하면 속성을 정의하는 함수는 각 호출에서 다른 엔터티 인 매개 변수로 인덱스 또는 키를 가져옵니다.

+0

아 물론 그렇습니다! 보세요, 나는 완전히 분명한 것을 놓쳤다는 것을 알았습니다 ;-) 정말 고마워요! (7 분 안에 수락) –

+0

@ JeffreyW. 거의 모든 사람들이 이것을 한 번합니다. 'array.forEach' ftw. – sqykly

관련 문제