La mise en œuvre mixins en JavaScriptProblème Vous souhaitez implémenter Ruby-mixins style en JavaScript d'étendre facilement les fonctionnalités objet. Théorie En Ruby, mixins sont un moyen d'étendre la fonctionnalité d'un objet par l'adoption de la fonctionnalité d'un autre objet. Lorsque vous instancier un type JavaScript, les méthodes et les propriétés associées à ce type dépendent de la déclaration du type. Pour étendre les fonctionnalités d'une instance, un bien est affecté à une fonction ou un autre objet. Source: / site / ROOT / articles ajax / javascript / DefinedClass fonction mixins.html () () DefinedClass.prototype.defined1 = function () () DefinedClass.prototype.defined2 = function () ()
La fonction DefinedClass est utilisé pour définir un type. Deux méthodes, defined1 et defined2, sont associées avec le type DefinedClass. Chaque méthode est associée à la propriété prototype, donc chaque fois DefinedClass est instancié, ces méthodes se partageront l'instance même fonction. Ainsi, si vous assignez une propriété de defined1 ou defined2, puis toutes les instances de DefinedClass seront en mesure de partager l'instance même propriété. Solution Pour prolonger une instance de DefinedClass, vous pouvez assigner individuellement les propriétés de l'instance. La copie d'une propriété individuelle est fastidieux, une solution plus efficace consiste à copier les propriétés d'un objet à un autre objet. Beaucoup de cadres, tels que Prototype et Dojo Toolkit, offrent la possibilité de copier les propriétés. Suivante est la mise en œuvre mixin pour Prototype. Source: / site / ROOT / prototype / dist / prototype.js Object.extend = function (destination, source) (for (propriété dans la source) (destination [des biens] = source [biens];) destination de retour; La fonction Object.extend a deux paramètres: la destination et la source. Le paramètre de destination représente un objet qui aura les propriétés ajoutées. Le paramètre source représente un objet qui aura ses propriétés copiés. Les propriétés sont copiés à l'aide d'une boucle for, car il n'est pas possible d'itérer les propriétés d'une instance de l'objet de toute autre manière. L'identificateur de propriété, et non la valeur de la propriété, est itérée. Pour récupérer la valeur du bien, vous pouvez utiliser la syntaxe suivante: source.property Le problème avec cette notation est que la propriété est définie explicitement, et en l'utilisant dans le cadre de l'exécution d'une fonction mixin est compliquée. La solution est d'utiliser la notation tableau JavaScript et récupérer la propriété comme un tableau. Pour en revenir à la solution de prototype, comme chaque propriété de la source est l'itération, la valeur est récupérée et affecté à la destination. Appliquons la méthode à l'aide d'étendre la déclaration suivante instance d'objet. Source: / site / ROOT / articles ajax / javascript / myExtensions mixins.html = (test: function (tstValue) (assertEquals (tstValue, MyExtensions.test.value);)) La déclaration myExtensions classe est une référence statique à une seule propriété incorporé qui est une instance de type Object. Nous voulons copier le bien à une instance de DefinedClass, comme le montre le test suivant. Source: / site / ROOT / articles ajax / javascript / prototype_mixin mixins.html: function () (var cls = DefinedClass new (); if (MyExtensions.test.value) (testManager.failed ();) Object.extend (CLS, myExtensions ); cls.test.value = 3; cls.test (3); cls.test.value = 10; cls.test (10);), Le test du code va au-delà de la convocation simple de Object.extend, mais révèle que la plupart des pochettes d'appliquer mixins utilisant des types de canard fondée sur des références. Il n'est pas mauvais, mais parce que les fonctions sont des objets, ils seront partagés entre les types de classes multiples. Pour le comprendre, regardez la mise en œuvre de MyExtensions.test. Les références de mise en œuvre de la propriété fonction test.value et des références croisées avec le paramètre tstValue. Dans l'implémentation de la fonction prototype_mixin, une instance de DefinedClass est créé, puis étendue aux méthodes de myExtensions. La propriété cls.test.value est attribué une valeur de 3, et la méthode d'essai est appelée. L'application de test vérifie la valeur de MyExtensions.test.value que 3. Si la méthode d'essai de la CLS ont été une copie de la MyExtension.test méthode, le test échouera parce que MyExtensions.test.value n'a pas été affecté, comme en témoigne le bloc si le test. Mais le code de test ne manque pas, ce qui indique que le typage cls.test et MyExtensions.test sont une seule et même méthode. Référencés à base de canard a des comportements bizarres, dont l'un est indiqué dans le code suivant. Source: / site / ROOT / articles ajax / javascript / GetExtensionFunctionality fonction mixins.html () (return (test: function (tstValue) (assertEquals (tstValue, this.test.value);))) prototype_inconsistent_mixin: function () (var = CLS1 DefinedClass new (); Cls2 var = DefinedClass new (); Object.extend (CLS1, GetExtensionFunctionality ()); Object.extend (Cls2, GetExtensionFunctionality ()); cls1.test.value = 3; try (cls2.test (3 );) catch (e) (if (e.jsUnitMessage) (info ( "prototype_inconsistent_mixin", "exception attendue (" + + e.jsUnitMessage ")");))), Ici, les fonctionnalités étendues sont définies dans le cadre d'un appel de méthode. Dans l'exemple précédent, la méthode d'essai a été partagé par plusieurs classes. Dans le test, CLS1 et Cls2 devraient également partager la même méthode d'essai. L'exécution du code de test se traduira par une exception attendue indiquant que cls.test.value n'a pas la valeur 3. En un mot, le problème est que vous avez deux façons d'appeler Object.extend, et vous obtenez deux comportements complètement différents en raison à la nature de la valeur et la référence de typage fondée sur le canard. C'est quelque chose que vous devez être au courant, car vous pourriez obtenir un comportement bizarre. Bien entendu, un contre-argument pourrait être que si vous pensez que sur la nature de la propriété prototype , le même genre de résultats comportement. Je suis d'accord que c'est le cas, mais également réaliser que les exemples ne pas utiliser l'identificateur de prototype. Un développeur JavaScript sait ce que les ramifications du prototype sont et seront ainsi savoir quand les utiliser et quand ne pas utiliser le mot clé. Dans les exemples de cet article, un comportement prototype a été illustré sans l'aide de prototypes. Nous savons au sujet de cette situation et avons deux méthodes mixin: l'un qui copie les références (typage de canard de référence) et un qui fait une copie complète (typage canard valeur). La valeur complète à base de canard tapé la mise en œuvre mixin suit. Source: / website / root / scripts / jaxson / Common.js mixin: function (copyTo, copyFrom, forceCopy) ( copiedFrom var = eval (ops.singleSerialize (copyFrom));for (propriété dans copyFrom) (if ((copyTo [biens] & & vigueur) | |! copyTo [biens]) (copyTo [biens] = copiedFrom [biens];))) Dans l'implémentation de la méthode mixin, la première étape consiste à générer une mémoire tampon de l'instance à être copié (ops.singleSerialize), puis exécuter le tampon en utilisant eval. Le processus de génération d'un tampon et en l'exécutant a pour effet de clonage de l'objet et ses propriétés. Puis, lorsque le clone est réaffirmé, l'objet à être étendue a des références à l'objet cloné, et non pas l'objet original. Cela remplit l'exigence que l'objet à être étendue a copié les propriétés de l'objet source. Dans le code source de l'article, vous trouverez également une méthode appelée ops.refMixin, qui se comporte comme les autres implémentations mixin et ayants droit des références à l'objet à être prolongé. Mixins Lorsque la mise en œuvre, gardez les points suivants à l'esprit: Mixins • vous êtes un moyen d'étendre la fonctionnalité d'un objet par l'adoption de la fonctionnalité d'un autre objet. En JavaScript, vous pouvez reproduire cette technique en copiant les références, soit en copiant les fonctionnalités directement. • mixins sont une forme de prototype à base de programmation où le comportement de l'objet est déterminée à l'exécution. • Vous mai pas écrire des propriétés qui font partie des fonctions, et donc penser que la copie de référence n'est pas un problème. Mais soyez prévenus: si vos références de source de l'objet propriétés que les objets de référence, l'objet n'est pas copié, mais plutôt d'une référence à l'objet. • Vous utiliserez mixins abondamment lors de l'écriture du code JavaScript, donc soyez prudents avec vos objets et des références. 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 mixins en JavaScript" 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: 240 users browsing the articles directory |
|
|