Javascript установщики / получатели - PullRequest
1 голос
/ 12 марта 2010
var author = {
firstname: 'Martin',
lastname: 'Hansen'
}

function settersGetters(propStr) {
for (var i = 0; i < propStr.length; i++) {

    author['_'+ propStr[i]] = null; 

    author.__defineGetter__(propStr[i],
    function() {
        return author['_'+ propStr[i]];
    });

    author.__defineSetter__(propStr[i],
    function(val) {
        author['_'+ propStr[i]] = val;
    });
};
}

Надеемся, что приведенный выше код будет генерировать установщики / получатели для любых предоставленных свойств (в массиве) для автора объекта.

Но когда я вызываю приведенный ниже код, имя и фамилия - olsen .. Что я делаю не так?

settersGetters(['firstname', 'lastname']);
author.firstname = 'per';
author.lastname = 'olsen';

console.log(author.firstname);
console.log(author.lastname);

Ответы [ 2 ]

2 голосов
/ 12 марта 2010

Я подозреваю, что это проблема закрытия, которую несколько полезных людей объяснили мне здесь .

Попробуйте обернуть ссылку i внутри функции и прочитать о замыканиях. Несмотря на всю помощь, я признаюсь, что до сих пор не понимаю их.

1 голос
/ 12 марта 2010

Определение сделано в замыкании, поэтому все сеттеры используют последнее значение i.

Используйте это вместо:

function setterGetter(property)
{
    author['_'+ property] = null; 

     author.__defineGetter__(property,
    function() {
        return author['_'+ property];
    });

    author.__defineSetter__(property,
    function(val) {
        author['_'+ property] = val;
    });
}
function settersGetters(propStr) {
for (var i = 0; i < propStr.length; i++) {
        setterGetter(propStr[i]);
};
}
...