繁体   English   中英

在Javascript中使用eval的替代方法

[英]Alternative for using eval in Javascript

在我的Javascript中,我有一个工厂。 根据传递的字符串,我将该字符串的新实例创建为一个对象。 例如

    function getEmployee (employeeType, department){
        var fn = eval(employeeType);
        return new fn(department);
    }

我不想在这里使用eval。 我可以在employeeType上使用switch语句,但是我不希望必须知道employeeType的任何依赖项。

还有另一种方法可以做到吗?

为了扩大我的原始评论,每当我遇到这样的问题时,一般的解决方案是创建某种有效名称的全局注册表:

function Manager() { /* manager employee type */ }
function Intern() { /* intern employee type */ }

var registeredTypes = {
    "manager": Manager,
    "intern": Intern
};

然后将函数编写为:

function getEmployee (employeeType, department) {
    if (!(employeeType in registeredTypes)) 
        throw "Invalid employee type: " + employeeType;
    var fn = registeredTypes[employeeType];
    return new fn(department);
}

但是,如果您真的很担心依赖项,则可以通过提供一种向注册表中添加新员工类型的全局方法,将其进一步分离:

function registerEmployeeType(employeeType, fn) {
    if (employeeType in registeredTypes) 
        throw "Employee type already registered: " + employeeType;
    if (typeof(fn) != "function")
        throw "May only register employee types as functions: " + employeeType;
    registeredTypes[employeeType] = fn;
}

现在,您的核心函数getEmployeeregisterEmployeeType可以自己声明,而无需注册任何有关员工类型的信息。 它们甚至可以从不同的脚本文件中注册,前提是它们定义registerEmployeeType 之后运行。 例如:

// core.js
var registeredTypes = { };
function getEmployee (employeeType, department) ...
function registerEmployeeType (employeeType, fn) ...

// manager.js
registerEmployeeType("manager", function() { /* manager employee type */ });

// intern.js
registerEmployeeType("intern", function() { /* intern employee type */ });

// index.html
<script src="core.js"></script>
<script src="manager.js"></script>
<script src="intern.js"></script>

您应该为employeeType传递一个函数,而不是一个字符串(或更经典的是-一个具有固定方法的对象),然后调用该函数而不是eval

感谢pswg我找到了答案。 我在工厂之前登记类型。 我仍然将类型作为字符串传递给我的工厂,但是在注册的类型中查找它。

非常感谢您的评论。

function getEmployee (employeeType, department){
    var fn = registeredTypes[employeeType];
    return new fn(department);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM