避免在此模块中使用eval

时间:2012-06-22 16:44:34

标签: javascript eval

我有这个模块模式,存储了一堆变量。我想创建一个可以返回任何给定var的单个函数(真正的模块具有实际函数 - 这只是条带化版本)。

var myObject = (function() {
  var _savings = '100',
      _year = new Date().getFullYear(),
      _phone = '1-800-555-1234';

return {
  getMe: function(param) {
    return eval(param);
}

一个示例用法是myObject.getMe('phone');将大肆宣传“1-800-555-1234”

我想避免使用eval(),因为它太邪恶了。

谢谢!

4 个答案:

答案 0 :(得分:3)

在javascript中,object.field相当于object["field"]

现在,问题在于您创建了一些不属于对象的私有变量,因此访问它们会很棘手。

另一种方法是:

var myObject = (function() {
  var _privates = {
    savings: '100',
    year: new Date().getFullYear(),
    phone: '1-800-555-1234'
  };

return {
  getMe: function(param) {
    return _privates[param];
  }
}())

答案 1 :(得分:0)

以面向对象的方式执行此操作,您可以首先使用成员* _savings *,* _year *,* _phone *创建原型定义。将 getMe 添加到原型中:

var myClass = function() {
    this._savings = '100',
    this._year = new Date().getFullYear(),
    this._phone = '1-800-555-1234';

    myClass.prototype.getMe = function(param) {
       return this[param]; 
    }
}

然后实例化对象并运行方法:

var myObject = new myClass();
console.log(myObject.getMe("_savings"));
  // "100"

编辑原始答案(正如Dancrumb所指出的,这不起作用;它们是私有成员,因此在函数 getMe 内部无法看到它们)。

使用括号表示法:

返回此[param];

答案 2 :(得分:0)

尝试以下方法:

var myObject = (function() {
    var data = {
        savings: '100',
        year: new Date().getFullYear(),
        phone: '1-800-555-1234'
    };
    return {
        getMe: function(param) {return data[param];}
    };
})();

答案 3 :(得分:0)

var myObject = {
    phone: '1-800-555-1234',
    year: new Date().getFullYear(),
    savings: 100,
    getMe: function(param) {
        return this[param];
    }
};
alert(myObject.getMe('phone'));