Pergunta

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

Esperamos que o código acima gerasse setters/getters para quaisquer propriedades fornecidas (em uma matriz) para o autor do objeto.

Mas quando eu chamo o código abaixo, o primeiro nome e o último nome é Olsen .. o que estou fazendo de errado?

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

console.log(author.firstname);
console.log(author.lastname);
Foi útil?

Solução

A definição é feita em um fechamento; portanto, todos os setters estão usando o último valor de i.

Use isso em vez disso:

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

Outras dicas

Eu suspeito que esta é uma questão de fechamento, que várias pessoas prestativas me explicaram aqui.

Tente embrulhar o i referência dentro de uma função e leia os fechamentos. Apesar de toda a ajuda, confesso que ainda não os entendo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top