2009-04-10 10 views
3

Si j'ai javascript OO qui ressemble à ceci:fonctions en tant que paramètres (avec paramètres) - 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(); 

Supposons que « theLoader » devrait être abstraite et générique. Je pourrais l'appeler et mettre le 'loadFunction' à presque n'importe quoi, donc je ne sais pas quels seront les arguments à un moment donné. La méthode 'load' doit appeler le 'loadFunction' et en quelque sorte être en mesure d'obtenir un argument.

Comment puis-je accomplir ce que j'essaie de faire? Si c'est une mauvaise façon de procéder, nous pouvons entièrement refactoriser le code. Je voudrais garder les restrictions de 'loadFunction' afin que je n'aie pas à coder les fonctions du chargeur d'une manière spéciale. À la fin de la journée, je voudrais emballer theLoader dans son propre fichier .js et ne pas avoir à singe avec lui. Donc, si vous connaissez la réponse, aidez un frère à sortir!

Merci, g

Répondre

1

Vous devriez faire votre loadFunction suivre une interface et utiliser le polymorphisme pour l'appeler. Cela dit, vous avez une réelle nécessité de capturer les arguments à someFunction en de façon.

Pouvez-vous autoriser la fonction load à prendre les paramètres requis par loadFunction?

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

Ou, permettent theLoader de les prendre dans le constructeur?

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') 

Je n'ai pas la moindre idée si c'est un bon design pour votre application. C'est certainement correct de le faire en JavaScript (en ce qui concerne la langue, je veux dire).

+0

C'est un bon conseil. J'ai essayé de le garder quelque peu abstrait par souci de simplicité, mais cela ressemblerait plus à ceci (commentaire suivant) –

+0

function customerDataLoader (customerID) {stuff} function clientInvoiceLoader (customerID, orderNumber) {substance} custLoader = new theLoader ({loadFunction: customerDataLoader}); invoiceLoader = nouveau theLoader ({loadFunction: invoiceDataLoader}); Les valeurs de paramètre ne sont pas statiques. –

3

Utilisez apply ou call pour exécuter l'appel de fonction. Une description des fonctions se trouve ici:

+0

J'ai regardé dans l'application. encore, puis-je simplement utiliser loadFunction.apply (this, arguments) étant donné que loadFunction n'est pas le nom de la fonction réelle? –

+0

Oui, comme apply et call sont les deux méthodes de l'objet Function. –

0

Je pense que ce que vous cherchez est le suivant:

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); 

En outre, vous confondez la notation littérale d'objet avec littéraux de fonction, ce qui est incorrect.

+0

Helgi - merci pour les conseils. J'étais un peu flou à propos de la notation par points et de la notation littérale d'objet. Votre exemple et votre pointeur ont été d'une aide précieuse. –

Questions connexes