2009-04-10 4 views
3

Если у меня есть некоторые OO JavaScript, который выглядит примерно так:функции в качестве параметров (с параметрами) - JavaScript

function someFunction(a, b, c) { 
    // do something with a, b, and c 
} 

function theLoader() { 
    loadFunction: someFunction, 
    load: function() { 
     // invoke the loadFunction with the proper parameter set 
    } 
} 

var myLoader = new theLoader(); 
myLoader.load(); 

Давайте предположим, что «theLoader», как ожидается, будет абстрактным и общим. Я мог бы назвать это и установить «loadFunction» почти на все, поэтому я не знаю, какие аргументы будут в любой момент. Метод «load» должен вызывать «loadFunction» и каким-то образом иметь возможность установить для него аргумент ....

Как я могу выполнить то, что я пытаюсь сделать? Если это плохой путь, мы можем полностью реорганизовать код. Я хотел бы оставить ограничения на «loadFunction», поэтому мне не нужно выполнять функции загрузчика специальным образом.

В конце дня я хотел бы упаковать загрузчик в свой собственный .js-файл и не иметь с ним обезьяны.

Итак - если вы знаете ответ, помогите брату!

Спасибо, г

ответ

1

Вы должны сделать свой loadFunction следовать интерфейс и использовать полиморфизм для его вызова. Сказав это, у вас есть реальное требование, чтобы зафиксировать аргументы до someFunction в некотором способом.

Можете ли вы разрешить функции load принять параметры, которые требуются loadFunction?

myLoader.load(1, '2', 'foo'); // calls this.loadFunction(1, '2', 'foo') 

Или позволить theLoader взять их в конструкторе?

function theLoader() { 
    this.loadFunctionArgs = arguments; 
} 

theLoader.prototype = { 
    loadFunction: someFunction, 
    load: function() { 
     return this.loadFunction.apply(this, this.loadFunctionArgs) 
    } 
} 

var myLoader = new theLoader(1, '2', 'foo'); 
myLoader.load(); // calls someFunction(1, '2', 'foo') 

У меня нет ни малейшего представления, если это хороший дизайн для вашего приложения. Конечно, это нормально делать в JavaScript (насколько я понимаю, язык).

+0

Это хороший совет. Я попытался сделать его несколько абстрактным для простоты, но это будет выглядеть по-настоящему (следующий комментарий) – 2009-04-10 14:56:55

+0

функция customerDataLoader (customerID) {stuff} function customerInvoiceLoader (customerID, orderNumber) {stuff} custLoader = new theLoader ({loadFunction: customerDataLoader}); invoiceLoader = new theLoader ({loadFunction: invoiceDataLoader}); Значения параметров не являются статическими. – 2009-04-10 14:57:31

3

Используйте apply или call для выполнения вызова функции. Описание функций можно найти здесь:

+0

Я искал приложение. все еще, могу ли я просто использовать loadFunction.apply (это, аргументы), учитывая, что loadFunction не является фактическим именем функции? – 2009-04-10 14:59:13

+0

Да, в качестве приложения и вызова используются оба метода объекта Function. –

0

Я думаю, что вы ищете это:

function theLoader() { 
    this.load = function() { 
     if (this.loadFunction) { 
      return this.loadFunction.apply(this, arguments); 
     } 
    }; 
} 
// Usage 
var loader = new Loader(); 
loader.loadFunction = someFunction; 
loader.load(1, 2, 3, 4); 

Кроме того, вы сводили объекта буквального обозначения с которые неверны.

+0

Хельги - спасибо за советы. Я был немного нечетким относительно нотации нотации и объектной нотации. Ваш пример и указатель были огромной помощью. – 2009-04-13 14:24:25

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