Aplicación de Mixins en JavaScriptProblema que desea aplicar Ruby-mixins estilo en JavaScript para ampliar fácilmente la funcionalidad del objeto. Teoría En Ruby, mixins son una forma de extender la funcionalidad de un objeto mediante la adopción de la funcionalidad de otro objeto. Cuando una instancia de un tipo de JavaScript, los métodos y propiedades asociadas con el tipo dependerá de la declaración de un tipo. Para ampliar la funcionalidad de un ejemplo, una propiedad se le asigna una función o de otro objeto. Fuente: / web / ROOT / artículos AJAX / JavaScript / DefinedClass función mixins.html () () DefinedClass.prototype.defined1 = function () () DefinedClass.prototype.defined2 = function () ()
La función DefinedClass se utiliza para definir un tipo. Dos métodos, defined1 y defined2, están asociados con el tipo DefinedClass. Cada método está asociado con la propiedad de prototipo, así que cada vez DefinedClass es una instancia, estos métodos comparten la instancia misma función. Por lo tanto, si asigna una característica de defined1 o defined2, a continuación, todas las instancias de DefinedClass serán capaces de compartir la instancia misma propiedad. Solución Para ampliar una instancia de DefinedClass, usted puede asignar individualmente las propiedades de la instancia. Individualmente la copia de una propiedad es tedioso, una solución más eficiente es copiar las propiedades de un objeto a otro objeto. Muchos de los marcos, como Prototype y Dojo Toolkit, proporcionan la capacidad de copiar las propiedades. Lo que sigue es la aplicación mixin para el prototipo. Fuente: / web / ROOT / prototipo / dist / prototype.js Object.extend = function (destino, origen) (for (propiedad de la fuente) (destino [de propiedad] = fuente [de propiedad];) destino de regreso; La función Object.extend tiene dos parámetros: el destino y la fuente. El parámetro de destino representa un objeto que tendrá propiedades agregó. El parámetro de la fuente que representa un objeto que han copiado sus propiedades. Las propiedades se copian mediante un bucle, ya que no es posible para recorrer las propiedades de una instancia de objeto de cualquier otra manera. El identificador de la propiedad, no el valor de la propiedad, se repite. Para recuperar el valor de la propiedad, puede utilizar la siguiente sintaxis: source.property El problema con esta notación es que la propiedad se define de manera explícita, y su uso en el contexto de la aplicación de una función mixin es complicado. La solución es utilizar la notación de matriz de JavaScript y recuperar la propiedad como una matriz. Volviendo a la solución de prototipos, ya que cada propiedad de la fuente se repite, el valor es recuperado y asignado al lugar de destino. Vamos a aplicar el método de extender mediante la siguiente declaración de la instancia de objeto. Fuente: / web / ROOT / artículos AJAX / JavaScript / MyExtensions mixins.html = (prueba: function (tstValue) (assertEquals (tstValue, MyExtensions.test.value);)) La declaración de la clase MyExtensions es una referencia estática a una propiedad simple incorporado que es una instancia de tipo Object. Queremos copiar la propiedad a una instancia de DefinedClass, como se muestra en la siguiente prueba. Fuente: / web / ROOT / artículos AJAX / JavaScript / prototype_mixin mixins.html: function () (var = CLS DefinedClass nuevo (), si (MyExtensions.test.value) (testManager.failed ();) Object.extend (CLS, MyExtensions ); cls.test.value = 3; cls.test (3); cls.test.value = 10; cls.test (10);), El código de prueba va más allá de la simple llamada de Object.extend, pero revela que la mayoría de los kits de herramientas aplicar mixins utilizando los tipos de pato sobre la base de referencias. No está mal, sino porque las funciones son objetos que serán compartidos entre varios tipos de clase. Para entender esto, mirar a la aplicación de MyExtensions.test. Las referencias de la aplicación de la función de la propiedad test.value y referencias cruzadas con el parámetro tstValue. En la aplicación de la función de prototype_mixin, una instancia de DefinedClass se crea y luego se extendió a los métodos de MyExtensions. La propiedad cls.test.value se le asigna un valor de 3, y el método de prueba se llama. La aplicación de la prueba verifica el valor de MyExtensions.test.value como 3. Si el método de ensayo de las NFT eran una copia de la MyExtension.test método, entonces la prueba fallará porque MyExtensions.test.value no se ha asignado, como lo demuestra la cuadra si la prueba. Sin embargo, el código de prueba no falla, lo que indica que escribir pato cls.test y MyExtensions.test son uno y el mismo método. Referencia basado tiene algunos comportamientos extraños, uno de los cuales se muestra en el siguiente código. Fuente: / web / ROOT / artículos AJAX / JavaScript / GetExtensionFunctionality función mixins.html () (return (prueba: function (tstValue) (assertEquals (tstValue, this.test.value);))) prototype_inconsistent_mixin: function () (var cls1 = DefinedClass nuevo (); cls2 var = DefinedClass nuevo (); 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", "excepción previstos (" + e.jsUnitMessage + ")");))), Aquí, la funcionalidad extendida se define en el contexto de una llamada al método. En el ejemplo anterior, el método de prueba fue compartida por varias clases. En la prueba, cls1 y cls2 también debe compartir el mismo método de ensayo. Ejecutar el código de prueba dará lugar a una excepción espera afirmando que cls.test.value no tiene el valor 3. En pocas palabras, el problema es que tiene dos formas de llamar Object.extend, y usted tiene dos por comportamientos completamente diferentes a la naturaleza del valor y la referencia a escribir pato base. Es algo que tienes que ser consciente, porque le podría dar un comportamiento extraño. Por supuesto, un argumento en contra podría ser que si usted piensa acerca de la naturaleza de la propiedad de prototipo , el mismo tipo de resultados de comportamiento. Estoy de acuerdo en que es el caso, pero también se dan cuenta de que los ejemplos no se utilice el identificador de prototipo. Un desarrollador de JavaScript sabe cuáles son las ramificaciones del prototipo son, por lo que sabrá cuándo usar y cuándo no utilizar la palabra clave. En los ejemplos de este artículo, un comportamiento prototipo fue ilustrado sin utilizar prototipo. Sabemos de esta situación y tienen dos métodos mixin: una que las copias de las referencias (escribiendo pato de referencia) y uno que lo haga una copia completa (duck typing valor). El valor total basado en pato escrito aplicación mixin siguiente. Fuente: / website / root / scripts / Jaxson / Common.js mixin: function (CopyTo, copyFrom, forceCopy) ( copiedFrom var = eval (ops.singleSerialize (copyFrom));para (la propiedad en copyFrom) (if ((CopyTo [de propiedad] & & vigor) | |! CopyTo [de propiedad]) (CopyTo [de propiedad] = copiedFrom [de propiedad];))) En la aplicación del método mixin, el primer paso es generar un buffer de la instancia para ser copiado (ops.singleSerialize), y luego ejecutar el buffer usando eval. El proceso de la generación de un búfer y la ejecución que tiene el efecto de la clonación del objeto y sus propiedades. Luego, cuando el clon se repite, el objeto que se ha ampliado las referencias al objeto clonado, y no el objeto original. Esto cumple con el requisito de que el objeto que se ha extendido copiado de las propiedades del objeto de origen. En el código fuente del artículo, usted también encontrará un método llamado ops.refMixin, que se comporta como las otras implementaciones mixin y asigna las referencias al objeto a ser prorrogado. Cuando mixins de aplicación, recuerda lo siguiente en mente: • Mixins son una forma de extender la funcionalidad de un objeto mediante la adopción de la funcionalidad de otro objeto. En JavaScript, puede replicar esta técnica mediante la copia de las referencias o por la funcionalidad de copiar directamente. • Mixins son una forma de prototipo de la programación basada en el comportamiento del objeto se determina en tiempo de ejecución. • Usted no puede escribir las propiedades que forman parte de las funciones, y por lo tanto creo que la copia de referencia no es un problema. Pero ojo: si su fuente de referencias propiedades de los objetos que los objetos de referencia, el objeto no se copia, sino más bien la referencia al objeto. • Usted usará mixins ampliamente al escribir el código JavaScript, así que ten cuidado con los objetos y referencias. un artículo presentado por Sonja Lande Descargo de responsabilidad:Nuestro sitio web no es responsable por el contenido de este artículo. Webarticles es un recurso de información gratuito. Importante: Este artículo "Implementación Mixins en JavaScript" fue traducida por un software automático. Sentimos pena por los errores de ortografía que pueda haber ocurrido. Gracias por su comprensión.
|
|||||
| Online: 207 users browsing the articles directory |
|
|