爲了擴大對我原先的評論,每當我遇到這樣的問題,一般的解決辦法是建立某種形式的有效名稱的全球註冊的:
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