无法通过eval()函数更新变量

Iro*_*ash 1 javascript oop

我会尝试尽可能清楚.我在Javascript中有一个DVD对象.它有一小部分属性,分配给它.我希望能够通过传递属性的名称而不是为每个不同的函数更改它们的值来改变它们的值,但我似乎无法完成它并且我很确定它是因为我不是熟悉eval()函数.

这是我正在使用的代码:

function DVDItem()
{
    var Properties = { 
              DVDShortName: "",  
              HasActivationKey: true, 
              NetInstFolderName: "", 
              AddTitlesCheck: true, 
              LocalTestCheck: true, } 

    this.updateProperty = function(propertyName, propertyValue)
    {
        var specificProperty = eval("Properties." + propertyName);
        specificProperty = propertyValue;
    }
}
Run Code Online (Sandbox Code Playgroud)

这样我就可以声明一个对象并改变它的属性:

var DVD1 = new DVDItem();
DVD1.updateProperty("HasActivationkey", false);
Run Code Online (Sandbox Code Playgroud)

但是我没有正确地做某事,因为这不起作用.有任何想法吗?

谢谢

Tre*_*vor 5

试试这个:

function DVDItem() {
    var Properties = { 
        DVDShortName: "",  
        HasActivationKey: true, 
        NetInstFolderName: "", 
        AddTitlesCheck: true, 
        LocalTestCheck: true, 
    } 

    this.updateProperty = function(propertyName, propertyValue) {
        Properties[propertyName] = propertyValue;
    }
}
Run Code Online (Sandbox Code Playgroud)

常见的约定是使getter和setter函数相同,如下所示:

function DVDItem() {
    var attrs = {
        DVDShortName: "",
        HasActivationKey: true,
        NetInstFolderName: "",
        AddTitlesCheck: true,
        LocalTestCheck: true
    }

    this.attr = function(key, value) {
        if(value !== undefined){
            return this.attrs[key] = value;
        }else{
            return this.attrs[key];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

至于eval(),这是MDN文档中的这个:

eval()是一个危险的函数,它使用调用者的特权执行它传递的代码.如果您使用可能受恶意方影响的字符串运行eval(),您最终可能会使用您的网页/扩展程序的权限在用户的计算机上运行恶意代码.更重要的是,第三方代码可以看到调用eval()的范围,这可能导致类似函数不易受影响的可能攻击.

eval()通常也比替代方案慢,因为它必须调用JS解释器,而许多其他构造由现代JS引擎优化.

对于常见用例,有eval()的安全(和快速!)替代方案.

在这里阅读更多.

  • "绝大多数[eval]被大多数JavaScript程序员琐碎,误用和彻底谴责,但通过查看一些最好的编码器的工作,你可以看到,当适当使用时,它可以创建一些很棒的代码否则这是不可能的" - John Resig在JavaScript Ninja的秘密中 (2认同)