La mise en œuvre déléguésProblème
Vous voulez utiliser une architecture de déléguer à rationaliser le fonctionnement de votre exécute le code et éviter les affrontements code. Théorie lorsque l'écriture en JavaScript, très souvent du code se battra pour l'attention. Un exemple de code lutte pour l'attention est l'événement window.onload. L'événement window.onload est appelé une fois la page HTML est complètement chargé et initialisé. Lorsque le navigateur demande window.onload, le navigateur est un script donnant la chance de s'initialiser avec une page HTML complète. Pour les scripteurs, cette méthode est très intéressant, et s'il ya deux boîtes à outils en utilisant window.onload, plus susceptibles que pas un ne remplacera l'autre. Imaginez le code suivant écrit par une boîte à outils: window.onload = function () (/ / Initialize Toolkit 1) Dans cet exemple de code de la boîte à outils est en disant que lorsque l'événement onload est appelée, utiliser mon fonctionnalité. La seconde boîte à outils intéressés par l'événement onload window.onload ne prendrait en compte les éléments suivants: window.onload = function () (/ / Initialize Toolkit 2) La deuxième cession pourrait fonctionner, mais il pose la question, ce qui se passe à l'initialisation de la boîte à outils 1? La réponse est qu'il n'est pas appelée. Toolkits 1 et 2 se battent pour l'attention de l'événement onload, et le gagnant est selon Toolkit assigne le dernier événement onload. Il ya trois solutions possibles à ce dilemme: • Convertir les pochettes d'utiliser le navigateur des balises spécifiques qui leur permettront de faire référence onload fonctions multiples. L'inconvénient de cette solution est que vous devez écrire un navigateur de code spécifique, qui augmente le coût de maintenance du code. • Utilisez une fonction qui appelle à la fois les initialisations. L'inconvénient est que vous devez fournir une fonction qui gère à la fois les initialisations. • Convertir les pochettes de jouer gentiment les uns avec les autres et de ne pas écraser les autres initialisations. L'inconvénient est que les pochettes sont de comprendre comment appeler les routines d'initialisation. Solution Comme mentionné, l'inconvénient de la première solution présentée dans la section précédente c'est que c'est navigateur donné. Pour Mozilla, la solution est assez élégant car il met en œuvre une architecture de délégué. Pour les autres navigateurs, la première solution n'est pas aussi élégant, et donc la solution finale est un mélange des solutions de deuxième et troisième. Pour le moment, cependant, nous allons mettre l'accent sur la seconde solution, qui est exécuté comme suit: window.onload = function () (initializeToolkit1 (); initializeToolkit2 ();) La fonction windows.onload se voit assigner une fonction qui appelle les routines d'initialisation des pochettes d'information 1 et 2. Les travaux de solution, mais elle a des problèmes d'entretien, car un développeur a pour ajouter ou supprimer des routines d'initialisation. Ce n'est pas un problème majeur, cependant. Si vous regardez la mise en œuvre de la fonction, c'est la conversion d'un appel de fonction en deux appels de fonction. Telle est la base d'un délégué. Les fonctions de la initializeToolkit1 et initializeToolkit2 n'ont rien à voir avec l'autre, et lorsqu'il est appelé, chacun pourrait facilement être trompés en pensant que c'est la seule fonction assignée à l'événement onload. Un délégué n'est pas comme un proxy, dans la mesure où un délégué à tous les appels fonctions, alors que d'un proxy va appeler une fonction d'abord, puis attendez la fonction appelée pour appeler les autres fonctions. D'un point de vue de la mise en œuvre, un délégué a une application très similaire à une procuration. La mise en œuvre JavaScript d'un délégué ne diffère d'un délégué traditionnelle parce qu'il n'y a pas d'exemple d'objet unique gérant toutes les références. Dans une mise en œuvre délégué classique, appelant la fonction window.onload va appeler une structure d'objet délégué, qui appelle la fonction de références gérées. Dans le cas de l'exemple, cela signifie appelant la structure de l'objet délégué appelle initializeToolkit1 et initializeToolkit2. Dans la mise en œuvre délégué JavaScript, window.onload référence à une fonction de délégué parent qui contient deux références fonction: func1 et func2. La fonction de délégué parent appelle la fois func1 et func2. Lorsque les fonctions de délégué des parents sont enchaînés, func1 (choisis à des fins d'illustration) fait référence à une fonction à appeler (initializeToolkit1), et func2 (encore une fois choisie à des fins d'illustration) des références de la délégation des parents suivant dans la chaîne. Dans la délégation prochaine rencontre de parents, un référencement des fonctions de la fonction à appeler (initializeFunction2), et les références d'autres fonctions d'une autre fonction de délégué des parents. Pour comprendre le problème de sérialisation, imaginez essayer de sérialiser window.onload références en utilisant: window.onload = function () (delegates.invoke (this, arguments);) var tampon = ops.serialize (window.onload); Dans l'exemple, les références window.onload une fonction qui appelle la méthode delegates.invoke variable globale, qui fera appel à des fonctions initializeToolkit1 et initializeToolkit2. Si nous voulons sauvegarder l'état de la page HTML, nous allons sérialiser window.onload parce qu'il est un point de référence standard. Pourtant window.onload sérialisation ne pas sérialiser les délégués. Il sérialise la référence aux délégués, et donc quand la page est recréée, l'instance de délégués sera manquant. Vous mai lire le paragraphe précédent et pense que j'ai perdu mes billes, parce que ce n'est pas ainsi que la sérialisation est fait. Vous pourriez mettre en œuvre la solution suivante à la place: window.unload = function () (var tampon = ops.serialize (délégués);) ` Dans cette solution, le déchargement fonction sera appelée, et un flux de données qui représente les délégués seront générés. Mais est-ce réellement la solution correcte? Je soutiens que la solution est de déléguer le problème des délégués variable à un autre emplacement, et ce n'est pas tout résoudre. Imaginons, par exemple, que vous êtes la sérialisation de l'état d'une page. Comme vous itérer les éléments, vous générez des fonctions associées. Ainsi vous sérialiser window.load et window.unload. Le grand avantage de cette approche est que lors du codage en utilisant un prototype à base de JavaScript est un langage qui vous ne craignez pas de multiples implémentations de partager les mêmes références. En utilisant une valeur approche en fonction, vous pouvez copier une fonction d'un objet à un autre et ne pas s'inquiéter du problème mixin décrite à l'article 2-15. Maintenant que vous êtes familier avec la théorie derrière la mise en œuvre délégué, penchons-nous sur les détails techniques . Source: / website / root / scripts / jaxson / Common.js délégué: fonction (par exemple, funcIdentifier, newfunc) (var delegatePrototype = function () (var func1 = __replace1; func2 var = __replace2; func1.apply (this, arguments); func2 . s'appliquent (this, arguments);) origFunc var; if (! exemple [funcIdentifier]) (origFunc = function () ();) else (= origFunc exemple [funcIdentifier];) exemple [funcIdentifier] = Generics.expand (delegatePrototype , (__replace1: origFunc, __replace2: newfunc));), Source: / site / ROOT / articles ajax / javascript / exceptions.html window.onload = function () (window.onerror = function (msg, fichier, location) (info ( "window.onerror1", "msg (" + msg + " ) fichier ( "+ file +") emplacement ( "+ location + ")");)) ops.delegate (window," onload ", function () (window.onerror = function (msg, fichier, emplacement) (info ( "window.onerror2", "msg (" + msg + ") fichier (" + file + ") emplacement (" + location + ")");))); Dans l'exemple, la fonction window.onload se voit assigner une fonction. La prochaine ligne de code source utilise l'appel de méthode ops.delegate de convertir la fonction assignée à un délégué. Ainsi, lorsque l'événement window.onload est appelé, les deux fonctions sont appelées, qui tous deux attribuer window.onerror. Une conséquence de l'utilisation de délégués est qu'un programmeur peut utiliser des délégués, mais oubliez les ressources dont ils affecter l'utilisation de délégués sont partagés aussi bien. Par conséquent, un bon programmeur ne cédera pas window.onerror, mais utilisera un délégué d'assigner window.onerror. Lors de l'écriture de code où une méthode ou une fonction de rappel doit être partagé, vous pouvez utiliser des délégués, mais gardez à l'esprit les points suivants : • Les délégués permettre aux programmeurs de partager un rappel de méthode, mais ils ne devraient pas présumer que les ressources de leur implémentation de la méthode sont exclusifs. • Les délégués de résoudre le problème où un seul appel de méthode peut être utilisée pour faire des appels de méthodes multiples. • Les délégués ne peuvent pas renvoyer des valeurs parce que de multiples méthodes mai retourner des valeurs: ainsi, les délégués doivent toujours utiliser des blocs de code. Les blocs de code sont intrinsèquement simple, multiple, ou pas orienté vers les résultats. Utilisation de blocs de code ne nécessite pas l'infrastructure pour faire quelque chose de spécial lorsque des données doit être retourné. • Les délégués peuvent être implémentées à l'aide de référence ou en tapant le canard de valeur, la principale différence entre eux étant la possibilité de sérialiser. 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 «Mettre en œuvre les délégués" 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: 329 users browsing the articles directory |
|
|