3

私はこのようなものを持っています...

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]();

より良い方法はありますか?

4

2 に答える 2

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;

2 番目は classes[className] をチェックし、存在する場合は新しいインスタンスを返す必要があります (JS は AND の右端にある値を返します)...
OR を返しnullます。

多分nullそれはあなたが望むものではない. しかし重要なのは、クラスがないという事実にもかかわらず、
誰かがあなたのファクトリに渡されるのを処理する準備ができている必要があるということです。"Bob"Bob

于 2012-10-19T01:04:05.443 に答える