发送构造函数作为参数

时间:2013-08-27 10:25:56

标签: javascript node.js

Javascript中的一个好处是能够将函数作为参数发送。我有一个应用程序,我必须发送类作为参数。

作为一个简单的例子,我需要一个对类进行一些测试的函数,我想将该类作为参数发送:

test(ClassA);
test(ClassB);

其中ClassA和ClassB是两个不同的类。

第一种可能的解决方案是:

function test(theClass) {
    var object1 = new theClass();
    var object2 = new theClass();
    assert(object1.toString()===object2.toString());
    // ... more asserts ...
}

这很好用,但它不允许我发送用于构造类的参数。例如,ClassA可能有几个初始化选项,我可能想要单独测试每个选项。

第二种可能的解决方案是:

function test(theClass, theInitializationOptions) {
    var object1 = new theClass(theInitializationOptions);
    var object2 = new theClass(theInitializationOptions);
    assert(object1.toString()===object2.toString());
    // ... more asserts ...
}

我可以这样使用:

test(ClassA, {option1: 1, option2: 2...});
test(ClassA, {option1: 2, option2: 3...});
test(ClassB, {});

这很好用,但很麻烦 - 它要求我发送两个参数,如果函数“test”使用子函数,它必须一直发送这两个参数。我正在寻找一个只需要一个参数的函数'test'。

第三种可能的解决方案是发送初始化函数而不是类:

function test(theClassConstructor) {
    var object1 = theClassConstructor();
    var object2 = theClassConstructor();
    assert(object1.toString()==object2.toString());
}

我可以这样使用:

test(function() { return new ClassA(1,2,3); })   /* test class A */
test(function() { return new ClassB(4,5); })     /* test class B */

问题是这个'test'函数需要一个函数而不是一个类。

我正在寻找一个函数'test',它将一个类作为参数(即它将使用“new”运算符初始化一个新对象),但仍允许调用者将参数与类一起传递。

换句话说,我正在寻找一种用构造函数绑定参数的方法。

这在Node.js中是否可行?

1 个答案:

答案 0 :(得分:1)

您应该可以使用Function#bind来执行此操作,

test(MyClass.bind(this, 1, 2, 3));

function test(klass) {
    var c = new klass();
    /* stuff */
}

使用this关键字时会忽略第一个参数new