为了扩大对我原先的评论,每当我遇到这样的问题,一般的解决办法是建立某种形式的有效名称的全球注册的:
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>
您可以创建员工类型的全局注册表,例如: 'var employeeTypes = {“manager”:Manager,“intern”:Intern}'?或者你会认为这是一种依赖性? –
如果您事先不知道类型,那么'fn = window [employeeType]'是一种替代方案,但@ p.s.w.g的解决方案更安全。无论如何,不需要'evil()'。 – Amadan
您是否可以不只是将employeeType作为工厂原型的对象? – Soren