1

这是一个很难回答的问题,但我会尽力解释。我将Class其构造函数的和参数作为对象。我需要做的是一个函数,它返回这个类的一个实例,将这个参数传递给构造函数。

这是代码:
一些随机且不可修改的类:

public Foo {
    public function Foo(a:int, b:String) {
        // constructor
    }
}

还有一些功能(在另一个类中):

function bar(params:Object):* {  
    var baz:Foo = new Foo(params.a, params.b);
    return baz;
}

我需要做的是使这个函数通用,而不params作为参数传递给Foo构造函数,因为我无法修改它。就像是:

function bar2(clazz:Class, params:Object):* {
    var baz:* = new clazz(/*some magic way to transform params in comma separated parameters*/);
    return baz;
}

任何人都可以帮助我吗?
非常感谢。

4

3 回答 3

7

这称为参数化工厂。首先我想到了Function.apply,但它不适用于构造函数(he-he)。所以,人们正在制造这样的工厂:

function create(what:Class, args:Array):* {
    switch (args.length) {
        case 0: return new what();
        case 1: return new what(args[0]);
        case 2: return new what(args[0], args[1]);
        ...
        //PROFIT!
    }
    throw new Error("Need moar cases!");
}
于 2010-12-01T16:27:18.757 回答
0

使用 ByteArray 复制对象怎么样?

function clone(source:Object):* {
    var copier:ByteArray = new ByteArray();
    copier.writeObject(source);
    copier.position = 0;
    return(copier.readObject());
}

newObjectCopy = clone(originalObject);

来源

于 2010-12-01T15:58:48.140 回答
0

如果您可以选择不使用构造函数,而是向initialise()每个可以构造的类添加一个函数,您可以使用Function.apply- 如下例所示。

public class ThingCreator
{
    public static function createTheThing(c:Class, params:Array):Object
    {
        var the_thing:Object = new c();
        the_thing.initialise.apply(the_thing, params);
        return the_thing;
    }
}

正如 alxx 上面指出的,在这种情况下 Function.apply 和 AS3 反射似乎不适用于 AS3 的构造函数。

于 2010-12-01T16:39:47.490 回答