JavaScripot Fonctions

Traiter les fonctions comme des objets

  

Problème Vous voulez profiter du fait que les fonctions sont des objets (rappelez-vous, tout est un objet en JavaScript). Beaucoup de personnes pensent que la théorie est une fonction de certains mots-clés utilisés dans JavaScript. Une fonction est également un objet qui peut être manipulée. Sachant qu'une fonction est un objet le rend très intéressant du point de vue de la rédaction du code JavaScript, parce que le code peut considérer la fonction comme un autre objet. Cela signifie que vous pouvez assigner des fonctions à des variables, des propriétés de classe, et ce que vous avez. Solution Une façon d'utiliser cette capacité est de mettre en œuvre le modèle de fabrique pour retourner un objet fonction. Par exemple, à Ajax, vous avez deux façons d'instancier l'objet XMLHttpRequest, et la méthode utilisée dépend du navigateur.

Le modèle d'usine est utilisée pour séparer l'interface de l'application. Habituellement, cela signifie mettre en place une interface, mais parce que JavaScript est un langage dynamique, il n'ya pas de véritable notion d'une interface. Dans un langage dynamique, une interface n'est pas nécessaire parce que vous pouvez appeler une méthode directement sans exiger un type spécifique. Dans le cas de l'instanciation de l'objet XMLHttpRequest, le modèle Factory renvoie une référence à une fonction qui peut être utilisé pour instancier XMLHttpRequest en utilisant la technique appropriée . En JavaScript, une fonction est un objet qui peut être assigné à une variable. Une façon de mettre en œuvre l'usine qui instancie XMLHttpRequest est d'utiliser les affectations de fonction. La mise en œuvre complète est la suivante.

 Source: / website / ROOT / ajaxrecipes / javascript / fonction functionsareobjects.html InstantiateIEXMLHttpRequest () (return new ActiveXObject ( "Microsoft.XMLHTTP");) function InstantiateOthersXMLHttpRequest () (return new XMLHttpRequest ();) function FactoryXMLHttpRequest () (if (window. XMLHttpRequest) (return InstantiateOthersXMLHttpRequest;) else if (window.ActiveXObject) (return InstantiateIEXMLHttpRequest;) throw new Error ( "Impossible d'instancier XMLHttpRequest");)

Dans l'exemple précédent, la fonction FactoryXMLHttpRequest est l'implémentation du pattern Factory. Au sein de l'implémentation de la fonction sont deux états qui vérifient si le navigateur est actuellement diffusée. Selon le navigateur, l'instruction return retourne une référence soit à la fonction InstantiateIEXMLHttpRequest ou la fonction InstantiateOthersXMLHttpRequest. Dans les deux cas, la référence retournée est une fonction qui va instancier l'objet XMLHttpRequest. Le code qui utilise la méthode FactoryXMLHttpRequest suit.

 Source: / website / ROOT / ajaxrecipes / javascript / factory_function functionsareobjects.html: function () (var InstantiateXMLHttpRequest = FactoryXMLHttpRequest (); xmlhttp var = InstantiateXMLHttpRequest (); assertNotNull (xmlhttp);),

Notez que dans l'exemple comment la variable InstantiateXMLHttpRequest peut être traitée comme une fonction. À titre d'illustration, la variable InstantiateXMLHttpRequest utilise un mélange de lettres majuscules et minuscules pour illustrer que si la variable est appelée, elle ressemble à un appel de fonction. Sur la base de l'identifiant et le contexte dans lequel la variable est utilisée comme une fonction, vous ne sauriez pas que la variable n'est pas une fonction.

C'est un point très important, car il montre qu'une fonction est simplement un autre objet. FactoryXMLHttpRequest est codée en utilisant une approche traditionnelle: le code déclare une fonction qui sera de retour en cas d'appel d'une instance d'une fonction. Le comportement du code est établi d'après le code a été analysé et initialisé. Avec JavaScript, ce n'est pas nécessaire, parce que vous pouvez initialiser les fonctions lorsque le code est en cours d'analyse pour l'optimiser. Par exemple, vous pouvez réécrire le code FactoryXMLHttpRequest comme suit.

 Source: / website / ROOT / ajaxrecipes / javascript / functionsareobjects.html 

Dans la mise en œuvre de modification, le code utilisé pour attribuer à la variable InstantiateXMLHttpRequest est exécuté en tant que page HTML est chargée. Ainsi, chaque fois que la variable InstantiateXMLHttpRequest est référencée comme une fonction, la manière appropriée de l'instanciation de XMLHttpRequest est exécuté. Il n'est pas nécessaire d'appeler une usine et prendre une décision chaque fois que la fonction est appelée. Cette capacité à traiter les fonctions comme des objets ajoute une facette de codage intéressante, en ce que le comportement du code peut être déterminée à l'exécution. Où, normalement, vous devez utiliser une structure de décision afin de déterminer le comportement approprié, une variable attribuée de manière dynamique peuvent être utilisés. Car une fonction est un objet, il ya des possibilités de codage supplémentaire. Par exemple, il est possible d'affecter dynamiquement les propriétés et méthodes pour une fonction, comme le montre l'exemple suivant.

 Source: / website / ROOT / ajaxrecipes / javascript / fonction functionsareobjects.html FunctionFunctionProperties (val_cmp) (assertEquals (val_cmp, FunctionFunctionProperties.value);) var VariableFunctionProperties = function (val_cmp) (assertEquals (val_cmp, VariableFunctionProperties.value);) var startIndex = VariableFunctionProperties . toString (). indexOf ("{"); endIndex VariableFunctionProperties.toString var = (). lastIndexOf ("}"); var tampon = VariableFunctionProperties.toString (). slice (startIndex + 1, endIndex); var = new InstantiatedFunctionProperties Function ( "val_cmp", buffer);

Cet exemple montre trois déclarations de fonctions, avec chaque déclaration illustrant une autre façon de déclarer une instance de fonction. La première déclaration, FunctionFunctionProperties, est l'approche traditionnelle. La seconde déclaration, VariableFunctionProperties, utilise une variable et une fonction anonyme. Et la troisième déclaration, InstantiatedFunctionProperties, est une instanciation explicite de l'objet Function, où les paramètres du constructeur représentent la déclaration des paramètres, et le dernier paramètre est le corps de la fonction.

Le corps de la fonction est un tampon de code JavaScript qui est converti en exécutable JavaScript. Pour chacun des trois implémentations de la fonction, le nom de la fonction est référencée et sera joint avec une référence à la valeur du bien. Avec chaque instance de fonction vous permet d'affecter un bien ou, si vous le désirez, une autre référence de fonction. Vous pouvez considérer les propriétés comme un moyen de déclarer une variable statique qui est associée à la fonction. Parce que chacune des trois déclarations de fonction représente un objet et une variable, elles peuvent être appelées d'une manière identique, comme l'illustre l'exemple suivant.

 Source: / website / ROOT / ajaxrecipes / javascript / function_with_properties functionsareobjects.html: function () (VariableFunctionProperties.value = 10; VariableFunctionProperties (10); FunctionFunctionProperties.value = 10; FunctionFunctionProperties (10); InstantiatedFunctionProperties.value = 10; InstantiatedFunctionProperties (10) ; testManager.success ();),

La lecture du code qui appelle les fonctions déclarées prend un peu de temps pour s'y habituer. Avant chaque appel de fonction, l'identifiant est utilisé comme s'il s'agissait d'un objet. Après que l'objet est référencé, l'objet est appelé comme une fonction. Ces exemples indiquent clairement que les fonctions ont une double nature, où les fonctions sont des objets et des objets peuvent être des fonctions. Cette double nature pose un problème: comment l'implémentation de la fonction savoir l'instance de la fonction? Le code suivant illustre ce problème.

 Source: / website / ROOT / ajaxrecipes / javascript / function_with_properties functionsareobjects.html: function () (VariableFunctionProperties.value = 10; VariableFunctionProperties (10); FunctionFunctionProperties.value = 10; FunctionFunctionProperties (10); InstantiatedFunctionProperties.value = 10; InstantiatedFunctionProperties (10) ; testManager.success ();),

La lecture du code qui appelle les fonctions déclarées prend un peu de temps pour s'y habituer. Avant chaque appel de fonction, l'identifiant est utilisé comme s'il s'agissait d'un objet. Après que l'objet est référencé, l'objet est appelé comme une fonction. Ces exemples indiquent clairement que les fonctions ont une double nature, où les fonctions sont des objets et des objets peuvent être des fonctions. Cette double nature pose un problème: comment l'implémentation de la fonction savoir l'instance de la fonction? Le code suivant illustre ce problème.

 Source: / website / ROOT / ajaxrecipes / javascript / GetFunction fonction functionsareobjects.html () (return function (cmpvalue) (assertEquals (val_cmp, unknownfunctioninstance. value);))

Dans l'exemple, la fonction GetFunction a une mise en œuvre qui retourne une instance unique de chaque fonction et chaque GetFunction temps est appelée. Si tu voulais faire référence à une propriété de l'instance de fonction, vous auriez bien du mal à le faire, car une fonction anonyme n'est associée à aucun identificateur. Dans les exemples précédents, la référence à l'instance de fonction a été utilisé pour référencer les propriétés et les méthodes de l'objet fonction. En utilisant cette façon de déclarer la fonction, il n'y a pas d'identificateur d'instance associé, et aucun moyen d'être en mesure de référencer la propriété de la fonction anonyme. La solution est d'utiliser une variable interne qui est référencé, comme l'exemple suivant montre.

 Source: / website / ROOT / ajaxrecipes / javascript / fonction functionsareobjects.html GetFunctionFixed () (var inst = function (val_cmp) (assertEquals (val_cmp, inst.value);) inst return;)

Comment le code qui résout le problème de l'instance en fait encore des œuvres inconnues mai sembler un peu mystérieux au premier abord. Elle implique l'utilisation d'une technique de programmation communément appelé un fermeture. Pour comprendre comment les fermetures travail, n'oubliez pas de penser à une fonction, comme un objet, pas un mot-clé function construire. Voici ce qui arrive en quelques mots:

1. L'appelant appelle GetFunctionFixed.

2. La mise en œuvre de GetFunctionFixed est exécutée.

3. Une fonction anonyme est déclarée, et un objet de fonction est instancié.

4. La fonction anonyme instanciée est assignée à la variable locale déclarée Inst.

5. L'anonymat références de fonction Inst, et le processeur JavaScript comprend la situation et crée une référence à l'échelle locale variable déclarée.

6. La variable INST est renvoyé à l'appelant.

7. Les tentatives garbage collector pour collecter les ordures inst, mais il ne peut pas parce que les références fonction anonyme inst tant anonyme est référencé quelque part. Quand vous considérez les étapes de ce processus ainsi que le fait que tout est un objet, il devient facile de voir comment ce code fonctionne. Quand une des références d'objet un autre objet, les objets ne peuvent être des ordures collectées si elles ne rien faire référence. Lors de l'utilisation des fonctions et de les traiter comme des objets, gardez les points suivants à l'esprit:

• Les fonctions sont des objets, et vous pouvez les manipuler comme des objets JavaScript autre. Toutefois, parce que les fonctions sont des objets, en utilisant des fonctions de manière irrégulière ou les propriétés des fonctions incorrectement peut causer des fuites de mémoire, Où la mémoire est référencée et non des ordures collectées, même si le script ne fait pas usage de la mémoire.

• Une configuration de fonctions ou de méthodes est possible lorsque la page HTML est chargée. Cela économise la logique de traitement, car le code n'a pas besoin de déterminer quel code doit être exécutée.

• Il faut un peu de temps et d'expérimentation pour s'habituer à l'idée que le comportement du code est déterminé lors de l'exécution, et non pas alors que vous avez écrit le code.

• étant des objets, des fonctions de référence peuvent propriétés ou des méthodes, des fonctions permettant de définir le comportement à l'exécution. Si vous ne affecter des propriétés ou des méthodes à des fonctions, alors faites-étant entendu que les propriétés et méthodes sont en transit qui est, si une fonction est recopiée d'une instance à l'autre, ne présumez pas que les propriétés sont copiés aussi.

un article présenté par Sonja Lande


Disclaimer:Notre site n'est pas responsable du contenu de cet article. Webarticles est une ressource d'information gratuite.
Important: Cet article «JavaScripot fonctions" a été traduit par un logiciel automatique. Nous nous sentons désolés pour les fautes d'orthographe que mai ont eu lieu. Nous vous remercions de votre compréhension.


Online: 299 users browsing the articles directory