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

2 回答 2

2

我怀疑这是一个关闭问题,几个有帮助的人在这里向我解释了。

尝试将i引用包装在一个函数中,并阅读闭包。尽管有所有的帮助,我承认我仍然没有真正理解他们。

于 2010-03-12T14:09:46.650 回答
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]);
};
}
于 2010-03-12T14:15:51.517 回答