2013-08-27 3 views
4

Одна из приятных вещей в Javascript - возможность отправлять функции в качестве параметров. У меня есть приложение, в котором мне нужно отправлять классы в качестве параметров.Отправить конструктор в качестве параметра

В качестве простого примера, мне нужна функция, которая делает некоторые тесты на классе, и я хочу, чтобы отправить класс в качестве параметра:

test(ClassA); 
test(ClassB); 

где ClassA и ClassB два разных класса.

A 1ое возможное решение состоит в:

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

Это работает хорошо, но это не позволяет мне отправить параметры для построения классов. Например, ClassA может иметь несколько параметров инициализации, и я могу протестировать каждый вариант отдельно.

2-ая из возможных решений является:

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', которая принимает только один параметр.

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', которая возьмет класс в качестве аргумента (т. Е. Инициализирует новый объект с помощью «нового» оператора), но все же позволяет вызывающему передавать аргументы вместе с классом.

Другими словами, я ищу способ связывания аргументов с конструктором.

Возможно ли это в Node.js?

ответ

1

Вы должны быть в состоянии использовать функции # привязки, чтобы сделать это,

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

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

Первый параметр this игнорируется при использовании new ключевого слова.

+0

Работает отлично, спасибо. –

Смежные вопросы