Как определить геттеры и сеттеры в цикле? - PullRequest
2 голосов
/ 04 октября 2011

Я хочу определить сеттеры и геттеры следующим образом:

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
    });

этот код приводит к тому, что все геттеры делают одно и то же (соответствует последней итерации цикла for)

Как мне изменить код, чтобы он работал правильно?

Ответы [ 3 ]

4 голосов
/ 04 октября 2011

Обернуть тело цикла 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,Если это неверно, отмените изменение.

2 голосов
/ 04 октября 2011

Эта функция доступна только в Firefox.

В этой ссылке http://www.codeproject.com/KB/scripting/crossbrowserjavascript.aspx показывает, что.

" defineGetter и defineSetter являются уникальными функциями для Mozilla / FireFox, и вы можете найти некоторые (все еще несколько) примеров в Интернете, выполнив поиск по ключевым словам в Google."

1 голос
/ 04 октября 2011

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);

НТН!

...