Comprendre les ramifications de canard typé CodeComprendre les ramifications de canard typé Code
Problème Vous voulez mieux comprendre d'où l'utilisation de la dactylographie de canard et les questions que vous devez connaître lorsque vous l'utilisez. Théorie, il ya une différence entre un Type de valeur et d'un Type de référence en JavaScript. Même pour un type référence, il ya une différence entre la définition de la référence comme une valeur ou un renvoi pur. Mais si vous vous souciez même pas la différence? Est-ce quelque chose que vous devez être au courant? C'est lorsque vous essayez de faire quelque chose de spécifique. JavaScript est un langage unique en ce qu'il a le type de canard, le type de latence et les caractéristiques du prototype. Pour créer un type en JavaScript, vous pouvez définir le type de définition via un prototype, ou vous pouvez définir les méthodes et propriétés en assignant une instance de classe. En général, vous avez la possibilité de regrouper des types de fil dynamiquement à l'exécution. Il ya deux manières de mettre en œuvre tapant canard: les types de valeur et les types référence. Vous devez être conscient de ces deux types, bien que dans cet article utilisent Imostly valeur tapant le type de canard. Je ne dis pas on est meilleur que l'autre juste que chacun a ses avantages et ses inconvénients. Les développeurs ont tendance à préférer l'un à l'autre en fonction de leurs habitudes de programmation. Par exemple, je préfère le canard valeur de frappe car j'ai tendance à sérialiser les objets pour une utilisation ultérieure. Solution Let's go par un exemple saisissant de canard en utilisant des valeurs de référence. Considérons le code suivant, qui est utilisé pour créer une fonction sans paramètres qui contient un état. Source: / client / ajaxrestrecipes / javascript / valuevsreferencetypes.js fonction CallMeReference (toCall, valeur) (return function () (toCall (valeur);)) Dans le code précédent, la fonction CallMeReference a deux paramètres: toCall, qui est une fonction, et la valeur, qui est l'état utilisée pour appeler la toCall fonction. L'idée derrière CallMeReference est de créer une fonction qui n'a pas de paramètres, mais il est appelé en utilisant un état défini plus haut. Le code suivant pourrait être utilisé pour exécuter un exemple: var func = CallMeReference (function (param) (info ( "param est (" + param + ")");), "Bonjour le monde"); func (); Dans cet exemple, la variable func est utilisé pour générer une encapsulé "bonjour" monde message. La variable fonction peut être appelée à plusieurs reprises, et le même message est généré. La variable peut être attribuée à d'autres variables et le même message pourrait être générée. Parce que nous sommes programmeurs, nous allons créer des fonctions qui suivent le modèle de constructeur et de precreate fonctions avec certains Etats. Les deux fonctions suivantes implémenter le modèle du développeur: Version1Reference fonction () (return CallMeReference (function (param) (info ( "Ver 1 est (" + param + ")");), ➥ «Bonjour tout le monde");) function Version2Reference () (return CallMeReference (function (param ) (info ( "Ver 2 est (" + param + ")");), ➥ «Bonjour tout le monde");) Le Version1Reference et fonctions Version2Reference générer des fonctions avec de légères différences. Les fonctions résultant générés peuvent être affectés à des variables, puis l'appeler comme dans l'exemple précédent. Jusqu'à ce point, tout ce que j'ai montré ce que tu pourrais le faire en utilisant les langages de programmation traditionnels tels que C #, Java et C + +. Ici, cependant, nous sommes en utilisant JavaScript, qui met en œuvre tapant le canard et le prototype de fonctionnalités, ce qui signifie que si une fonction est assignée à une variable, nous ne savons pas comment cette mission qui s'est passé. Ce besoin de savoir qui fait quoi cession n'a pas d'importance en C + +, C # ou Java, parce que le programmeur définit l'ordre et la présentation des types d'avance, et au cours de l'exécution qui commande ne peut être changé. En JavaScript, cet ordre n'est pas défini à l'avance qu'il est défini à l'exécution. Par exemple, le code suivant est possible: if (flag) (func = Version1Reference ();) else (func = Version2Reference ();) Lorsque fonction a été assignée, vous ne savez pas si elle a été assignée en utilisant le code de Version1Reference ou de Version2Reference. Lorsque le code assigné est exécutée, vous pouvez déterminer à partir logiquement le comportement si la Version1Reference ou Version2Reference fonction a été utilisée. La raison pour laquelle je dis que vous ne savez pas quel code a été attribué parce que lorsque vous sérialiser les fonctions variables, le code suivant est généré: function () (toCall (valeur);) Le code généré vous dit que les variables toCall et la valeur ont été attribués, mais vous ne savez pas à quoi. Cela peut devenir problématique si vous essayez de sérialiser un objet qui renvoie à la fonction générée. Si vous sérialiser la fonction et la tentative d'exécuter la fonction, une erreur sera générée, car les variables toCall et la valeur ne serait pas définie. Vous pouvez sérialiser l'état des membres des données, mais les méthodes de sérialisation causes à l'Etat soient lost.For exemple, imaginez que vous écrivez une demande de prêt, et vous êtes en train de créer un client. Le client dispose d'un certain âge, adresse, et son profil. Dans un environnement de programmation traditionnelle, que vous associez à l'État pour un objet à chaque fois l'état est chargé. Cela signifie que chaque fois que l'Etat est chargé, vous devez exécuter les différentes implémentations pattern Builder pour créer le type d'objet approprié. Utilisant JavaScript, ce n'est pas nécessaire parce que l'état de l'objet, y compris les méthodes, pourrait être sérialisé. Il est ainsi possible de sérialiser un objet complet, le stocker dans une base de données, ou exécuter dans un autre contexte. Fonctions dynamiques besoin d'utiliser les types de valeur, ce qui signifie CallMeReference doit être modifié comme suit: fonction CallMeValue (toCall, valeur) (return eval ( "function () (func var =" + ➥ toCall.toString () + "; func ( '" + value.toString () + "');)");) La fonction CallMeValue est comme CallMeReference, sauf qu'il sérialise la fonction et la valeur pour les tampons de chaîne qui sont enchaînées et exécuté. Le résultat de l'exécution est une fonction qui génère quand sérialisé le tampon suivant: function () (func var = (function (param) (info ( "param est (" + param + ")");}); ➥ func ( "Bonjour le monde");) La fonction de sérialisation comporte exactement comme la fonction créée en CallMeReference, mais la fonction de valeur peut être sérialisé et exécuté sur un autre ordinateur ou dans un autre contexte. Lorsqu'on écrit du code que le code dynamiquement fils ensemble, vous devez réfléchir à l'opportunité de l'utilisation ou la valeur de référence de programmation techniques. Lorsqu'on écrit du code, à examiner les règles suivantes de base: • les types de canard référence doivent être considérés comme des types transitoire qui ne vivent que pour la mesure de l'exécution de JavaScript (par exemple, une page HTML). • les types de canard de référence sont créés en utilisant le modèle Builder. • Une fois créé, le type de canard de référence ont un léger avantage de performance, car ils ne nécessitent pas la charge d'exécuter l'instruction eval dans l'implémentation du modèle Builder. • les types de canard de référence peuvent partager des instances avec des instances d'objets multiples, car vous assignez des références. • les types de canard valeur doit être considérée comme à long terme des objets sérialisable où l'État et le code peut être sérialisé. • les types de canards de valeur sont créés en utilisant le modèle Builder. • les types de canards de valeur sont légèrement plus lent que les types de référence de canard, car le code est le résultat de la sérialisation, la construction d'une mémoire tampon, puis d'évaluation, la mémoire tampon. • les types de canards de valeur ne sont pas l'effet secondaire d'avoir des fonctions se comportent de façon irrégulière en raison d'instances d'objets assignés. Chaque appel à un des types de résultats de canard valeur pattern Builder dans une démarche de table rase, où les variables sont attribuées à l'État accordée à la structure Builder. 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 «Comprendre les ramifications de canard typé Code» 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: 233 users browsing the articles directory |
|
|