如何在循环中定义getter和setter?

时间:2011-10-04 11:35:19

标签: javascript getter-setter

我想用以下方式定义setter和getter:

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循环的最后一次迭代)

我应该如何修改代码以使其正常工作?

3 个答案:

答案 0 :(得分: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变量 不会改变。

我还将Object替换为myObj。如果这不正确,请还原更改。

答案 1 :(得分:2)

此功能仅适用于Firefox。

在此链接http://www.codeproject.com/KB/scripting/crossbrowserjavascript.aspx中显示。

defineGetter defineSetter 是Mozilla / FireFox的独特功能,您可以通过Google搜索这些关键字,在互联网上找到一些(很少)样本。 “

答案 2 :(得分:1)

var properties = ['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!