Javascript setters / getters

时间:2010-03-12 14:01:06

标签: javascript setter getter

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

2 个答案:

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