[英]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;
}
现在,您的核心函数getEmployee
和registerEmployeeType
可以自己声明,而无需注册任何有关员工类型的信息。 它们甚至可以从不同的脚本文件中注册,前提是它们在定义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.