2

独自のゲッターとセッターを動的に構築するオブジェクトを作成しようとしています:

function Person( properties ) { // 'properties' is an object literal

    this._private = properties; // private by convention

    for ( key in this._private ) {

        this[key] = function() {

            return this._private[key];
        }
    }
}

私は、これが次のようなものを作成することを望んでいました:

var jack = new Person({

    working:true,
    age:33,
    gender:'male'
});

jack.working() --> true
jack.age() --> 33
jack.gender() --> 'male'

問題は、次のように常に 'male' を返すことです。

jack.working() --> 'male'
jack.age() --> 'male'
jack.gender() --> 'male'

私は何が欠けていますか?ああ、これは単なる概念実証です。これが JavaScript でゲッターとセッターを作成するための完璧なソリューションではないことはわかっています。

4

2 に答える 2

7

古典的なスコープの問題があります。の周りにスコープを作成する新しい関数を作成しますkey

function Person(properties) { // 'properties' is an object literal
    var key;

    this._private = properties; // private by convention
    this.buildGetter = function (key) {
        this[key] = function () {
            return this._private[key];
        }
    };
    for (key in this._private) {
        this.buildGetter(key);
    }
}

例: http://jsfiddle.net/SEujb/

于 2012-11-27T20:36:58.070 に答える
3

eval は悪だと誰もが言いますが、避けられない場合もあります。

function Person( properties ) { // 'properties' is an object literal

    this._private = properties; // private by convention

    for ( key in this._private ) {

        eval("this[key] = function() { return this._private['"+key.toString()+"'];}");
    }
}

jsFiddle: http://jsfiddle.net/pitaj/9sWbe/1/

于 2012-11-27T20:51:41.180 に答える