setters JavaScript / captadores
-
19-09-2019 - |
Pregunta
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;
});
};
}
El código anterior sería de esperar generar setters / getters para propiedades suministrados (en una matriz) para el autor objeto.
Pero cuando llamo el código de abajo Ambos nombre y apellido Olsen es .. ¿Qué estoy haciendo mal?
settersGetters(['firstname', 'lastname']);
author.firstname = 'per';
author.lastname = 'olsen';
console.log(author.firstname);
console.log(author.lastname);
Solución
La definición se realiza en un cierre, por lo que todos los emisores están utilizando el último valor de i.
Utilice este lugar:
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]);
};
}
Otros consejos
Sospecho que esto es un problema de cierre, que varias personas me explicaron votos aquí .
Trate de envolver la referencia i
dentro de una función, y leer sobre los cierres. A pesar de toda la ayuda, confieso que todavía no entiendo muy bien de ellos.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow