如何在javascript中创建通用工厂?

时间:2013-01-18 04:11:10

标签: javascript

工厂类不是我要找的最终产品,但它基本上是我的问题归结为。我正在寻找一个我们称之为foo的类,它可以在另一个类栏中作为参数传递给它的构造函数,这样当以后调用fooInstance.create()时它会返回一个新的bar实例。我可以很容易地弄清楚如何使fooInstance.create(bar)创建一个bar实例。但这不是我需要的。我需要工厂类的每个实例来创建特定类型的对象。这样:

    fooCar = new foo(Car);
    fooTruck = new foo(Truck);
    myCar = fooCar.create();
    myTruck = fooTruck.create();

这将是Generics在c#中轻松处理的事情。我要么得到错误,要么最终搞砸foo的原型,然后改变foo的所有实例创建的类型。

2 个答案:

答案 0 :(得分:1)

只需使用一个create方法从工厂返回常规对象:

function foo (Constructor) {
    return {
        create: function () {
            return new Constructor();
        }
    };
}

查看小提琴:http://jsfiddle.net/fR5Gz/1/

答案 1 :(得分:0)

感谢大家的帮助。 @missingno我认为我试图做的细节会让问题变得复杂,但现在我认为这是另一回事。下次我会更清楚。我不是在寻找类型安全,但没有它也许没有理由这样做。也许我陷入了古典思维中。

我今天早上自己弄清楚了,因为我没有收到任何关于此线程的电子邮件提醒,就像我应该这样,所以我认为还没有任何回复。这是我的解决方案(仅限相关代码):

    ORM.Repository = (function (){
    function Repository(ob){
        this.construct = ob;
    };
    //bunch of other generic repository stuff deleted
    Repository.prototype.make = function () { return new this.construct();}
    return Repository;
})();

用法:

    var carRepository = new ORM.Repository(car);
    var personRepository = new ORM.Repository(person);
    var myCar = carRepository.make();
    var user = personRepository.make();