2013-08-27 35 views
4

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, {}); 

這種運作良好,但它是很麻煩 - 它需要我送兩個參數,如果「測試」功能使用子功能,它將不得不一直髮送這兩個參數。我正在尋找只有一個參數的函數'測試'。

第3可能的解決方案是發送一個初始化函數,而不是一類:

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'(即它將使用「new」運算符初始化一個新對象),但仍允許調用者將參數與類一起傳遞。

換句話說,我正在尋找一種方法來綁定參數與構造函數。

這是可能的Node.js?

回答

1

你應該能夠使用功能#綁定要做到這一點,

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

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

第一個參數this使用new關鍵字時忽略。

+0

很好,謝謝。 –

相關問題