我有这样的事情......
define(['ClassA', 'ClassB', 'ClassC'],
function(ClassA, ClassB, ClassC)
{
return {
build: function(className) {
var obj;
switch(className)
{
case 'ClassA': obj = new ClassA(); break;
case 'ClassB': obj = new ClassB(); break;
case 'ClassC': obj = new ClassC(); break;
}
return obj;
}
}
}
这似乎没问题,但有没有更好的方法来编写它?我尝试将开关更换为
return new arguments[className](); // doesn't work
我最接近的是使用地图:
var classes = {
ClassA: ClassA,
ClassB: ClassB,
ClassC: ClassC
}
return new classes[className]();
有更好的方法吗?
答案 0 :(得分:3)
你的对象真的没问题。
它快速,高效且易于遵循
我唯一的建议是创建一个var来保存值,或者更明确地测试className
是否是一个合适的字符串,并且实际上在你的列表中:
或者:
var construct = classes[className];
if (construct) { return new construct(); }
else { /* handle the case where the class doesn't exist */ }
或者:
return classes[className] && (new classes[className]()) || null;
第二个检查类[className]并且应该返回一个新实例(如果它存在)(JS返回AND右边的值)...
或者它将返回null
。
也许null
不是你想要的
但重点是,你应该准备好处理通过"Bob"
到你工厂的人,尽管事实上没有Bob
类。
答案 1 :(得分:-1)
使用Function Modules as Factories:
define(function(require){
var classes = {
'ClassA' : require('ClassA'),
'ClassB' : require('ClassB'),
'ClassC' : require('ClassC')
};
return function(className){
try {
return new classes[className];
} catch(error) {
throw new Error('Unknown className Specified.');
}
}
});