在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方法,除非我必须这样做。见和。