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

上記のコードは、オブジェクトの作成者に (配列で) 提供されたプロパティのセッター/ゲッターを生成することを願っています。

しかし、以下のコードを呼び出すと、ファーストネームとラストネームの両方がオルセンです..何が間違っていますか?

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

The definition is made in a closure, so all the setters are using the last value of i.

Use this instead:

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 に答える