2011-10-04 3 views
2

다음과 같은 방법으로 setter와 getter를 정의하고 싶습니다 :루프에서 getter와 setter를 정의하는 방법은 무엇입니까?

var myObj = { 
    // this is the object that should be 
    // filled with new setters and getters 
    ... 
} 
/** 
* This object contains getters and setters for myObj 
*/ 
var Fields = { 
    param1: {defaultValue: ..., type: ..., ...} 
    param2: ... 
} 
// so the following code doesn't work properly 
for (var field in Fields) 
    Object.__defineGetter__(field, function() { 
     // do smth 
    }); 

이 코드는 모든 getter가 동일한 물건 (for 루프의 마지막 반복에 해당)를 수행하도록합니다.

제대로 작동하도록 코드를 수정해야합니까?

답변

4

랩이 방법으로 익명 함수의 for 루프의 몸 :

for (var field in Fields){ 
    (function(field){ 
     myObj.__defineGetter__(field, function() { 
      // do something, pointing to unique variables using "field" 
      // Example: 
      doSomethingSpecial(Fields[field].defaultValue); 
     }); 
    })(field) 
} 

이 방법의 효과 (익명) 함수는 자신의 범위를 가지고 있다는 사실에 근거한다. 프리미티브 변수 (문자열, 숫자)는 값을 인수로 함수에 전달됩니다. 이 때문에 익명 함수 내의 field 속성은 루프에 정의 된 field 속성과 구별됩니다.
field (함수 외부)의 값이 변경되면 field 변수 안에의 함수는 변경되지 않습니다.

또한 ObjectmyObj으로 바 꾸었습니다. 잘못된 경우 변경 사항을 되돌립니다.

+0

그래, 그게 내가 필요한거야! Thnx! – tsds

+0

'__defineGetter__'의 사용은 권장되지 않습니다. (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/__defineGetter__). 대신에 [defineProperty] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty)를 사용하십시오. – Christian

+0

예를 들어 [this so answer] (https://stackoverflow.com/a/23308747/969483)도 참조하십시오. – Christian

2

이 기능은 Firefox에서만 사용 가능합니다.

이 링크에서 http://www.codeproject.com/KB/scripting/crossbrowserjavascript.aspx은 이것을 보여줍니다.

는 "defineGetterdefineSetter 모질라/파이어 폭스에 고유 한 기능이고, 당신이이 키워드를 구글을 통해 검색하여 인터넷에 일부 (여전히 몇) 샘플을 찾을 수 있습니다."

1

var 속성 = [ 'asd', 'asd2', 'asd3'];

var myob = function(){}; 

for(var x=0;x<properties.length;x++) 
{ 
    var p = properties[x]; 

    var getter = function(){ return this['_' + arguments.callee.propname]; }; 
    getter.propname = p; 
    myob.prototype.__defineGetter__(p, getter); 


    var setter = function(value){ this['_' + arguments.callee.propname] = value; }; 
    setter.propname = p; 
    myob.prototype.__defineSetter__(p, setter); 
} 


var myobi = new myob(); 

myobi.asd = 33; 
alert(myobi._asd); 
alert(myobi.asd); 
myobi.asd2 = 44; 
alert(myobi._asd2); 
alert(myobi.asd2); 

HTH!

관련 문제