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。
但是当我调用下面的代码时,firstname和lastname都是olsen ..我做错了什么?
settersGetters(['firstname', 'lastname']);
author.firstname = 'per';
author.lastname = 'olsen';
console.log(author.firstname);
console.log(author.lastname);
答案 0 :(得分:2)
我怀疑这是一个封闭问题,有几位乐于助人的人向我解释here。
尝试在函数中包装i
引用,并阅读闭包。尽管有各种帮助,但我承认我仍然不理解它们。
答案 1 :(得分:1)
定义是在闭包中进行的,所以所有的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]);
};
}