在Javascript中按名称(字符串)返回私有对象属性

在Javascript中按名称(字符串)返回私有对象属性,javascript,Javascript,我已经通过创建一个返回这些属性的方法,找到了一个访问对象私有属性的方法。但是,我想创建一个函数,它可以根据传递的字符串参数返回任何对象属性 下面是我正在尝试做的一个例子: function MyObj() { var myProp = 10; this.getProp = function( propName ) { return( propName ); // THIS IS WHERE I AM STUCK }; } MyObj.prot

我已经通过创建一个返回这些属性的方法,找到了一个访问对象私有属性的方法。但是,我想创建一个函数,它可以根据传递的字符串参数返回任何对象属性

下面是我正在尝试做的一个例子:

function MyObj() {

    var myProp = 10;

    this.getProp = function( propName ) {

        return( propName ); // THIS IS WHERE I AM STUCK

    };


}

MyObj.prototype.getMyProp = function() {

    return this.getProp( 'myProp' );

};

var myObj = new MyObj();

console.log( myObj.getMyProp() );
从这个示例中可以看到,返回的字符串“myProp”不是变量。我不能使用这个[propName],因为我不在正确的范围内,也不能使用that/self技术访问该范围


如何使用字符串返回对象属性?

一个简单的解决方案是将私有变量包装到如下对象中:

function MyObj() {
    var privateVars = {
        myProp: 10
    };

    this.getProp = function( propName ) {
        return privateVars[propName];
    };
}

MyObj.prototype.getMyProp = function() {
    return this.getProp( 'myProp' );
};

var myObj = new MyObj();

console.log( myObj.getMyProp() ); // 10

更新:在这种情况下似乎也可以,但我不推荐:

function MyObj() {
    var myProp = 10;

    this.getProp = function( propName ) {
        return eval(propName);
    };
}

MyObj.prototype.getMyProp = function() {
    return this.getProp( 'myProp' );
};

var myObj = new MyObj();

console.log( myObj.getMyProp() ); // 10

为什么不推荐eval()?@McShaman主要是因为它不安全。有人可以很容易地编写
myObj.getProp('myProp=20')
来修改私有变量。验证属性名称(例如,使用
/^\w+$/.test(propName)
)会有所帮助,但我仍然会选择非eval方法,除非我必须这样做。见和。