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;
});
};
}上面的代码有望为对象作者提供的任何属性(以数组形式)生成setter/getter。
但是当我调用下面的代码时,名字和姓氏都是olsen。我做错了什么?
settersGetters(['firstname', 'lastname']);
author.firstname = 'per';
author.lastname = 'olsen';
console.log(author.firstname);
console.log(author.lastname);发布于 2010-03-12 22:15:52
定义是在一个闭包中完成的,所以所有的setter都使用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]);
};
}发布于 2010-03-12 22:09:47
我怀疑这是一个闭包问题,有几个乐于助人的人向我解释了here。
尝试将i引用包装在函数中,并阅读闭包。尽管有很多帮助,我承认我仍然不能真正理解它们。
https://stackoverflow.com/questions/2433182
复制相似问题