JavaScript Setters/Getters
-
19-09-2019 - |
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);
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