Javascript 动态getter和setter-为什么';这不管用吗?

Javascript 动态getter和setter-为什么';这不管用吗?,javascript,dynamic,getter-setter,Javascript,Dynamic,Getter Setter,我试图创建一个动态构建自己的getter和setter的对象: function Person( properties ) { // 'properties' is an object literal this._private = properties; // private by convention for ( key in this._private ) { this[key] = function() { return t

我试图创建一个动态构建自己的getter和setter的对象:

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创建getter和setter的完美解决方案。

您遇到了一个经典的范围问题。创建一个新函数,以围绕
键创建作用域

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

示例:

每个人都说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()+"'];}");
    }
}

JSFIDLE:

解释党,我完全忽略了范围陷阱。因此他不需要编写
并返回此
?:O@BarnabasSzabolcs不确定你的意思是什么?我的意思是在function Person的末尾。我知道这不是你的问题,你可能已经知道了,但是如果你在for循环中加入一个'var',它会改进代码,例如:for(这里的var key.\u private){…}。否则,“key”变量将在您的全局范围内创建(甚至更糟:任何现有变量都将被覆盖)。@Maate您完全正确!虽然Andrewhitaker的答案在这个例子中可能更好。这里绝对没有必要使用
eval
。@Andrewhitaker我从来没有说过有。我说可能有些情况下没有其他办法。