La aplicación de los delegadosProblema
Usted desea utilizar una arquitectura de delegado para racionalizar cómo se ejecuta el código y evitar enfrentamientos código. Teoría Al escribir JavaScript, muy a menudo código lucha por la atención. Un ejemplo de código de la lucha por la atención es el evento window.onload. El evento window.onload se llama una vez que la página HTML se ha cargado completamente y inicializado. Cuando el navegador pide window.onload, el navegador está dando una secuencia de comandos de la oportunidad de inicializarse con una página completa en HTML. Para los programadores, este método es muy interesante, y si hay dos conjuntos de herramientas usando window.onload, más probable es que uno se sobrescribe el otro. Imaginemos el siguiente código escrito por un conjunto de herramientas: window.onload = function () (/ / inicializa el conjunto de herramientas 1) En este ejemplo de código de la caja de herramientas es decir que cuando se llama al proceso de carga, utilizar mi funcionalidad. El kit de herramientas segunda interesados en el evento onload asignaría window.onload a lo siguiente: window.onload = function () (/ / inicializa Toolkit 2) La segunda tarea sería el trabajo, pero cabe preguntarse, ¿qué pasa con la inicialización de la caja de herramientas 1? La respuesta es que no es llamado. Kits de herramientas de 1 y 2 están luchando por la atención del proceso de carga, y el ganador es cualquier conjunto de herramientas le asigna el evento onload pasado. Hay tres posibles soluciones a este dilema: • Convertir los paquetes de herramientas para el uso del navegador de las etiquetas específicas que les permitan hacer referencia a las funciones de onload múltiples. La desventaja de esta solución es que tiene que escribir código específico del navegador, lo que aumenta el costo de mantenimiento del código. • Utilice una función que llama a ambas inicializaciones. La desventaja es que es necesario proporcionar una función que gestiona tanto la inicialización. • Convertir los paquetes de herramientas para jugar bien con los demás y no sobrescribir la inicialización de otro. El inconveniente es que los paquetes de herramientas tiene que averiguar cómo llamar a las rutinas de inicialización de otro. Solución Como se ha mencionado, la desventaja de la primera solución presentada en la sección anterior es que es navegador específico. Para Mozilla, la solución es bastante elegante, ya que implementa una arquitectura de delegado. Para otros navegadores, la primera solución no es tan elegante, y por lo tanto la solución final es una mezcla de las soluciones segunda y tercera. Por el momento, sin embargo, vamos a concentrarnos en la segunda solución, que se aplica como sigue: window.onload = function () (initializeToolkit1 (); initializeToolkit2 ();) La función de windows.onload se le asigna una función que llama a la rutina de inicialización de herramientas 1 y 2. Las obras de solución, pero tiene problemas de mantenimiento, ya que un desarrollador tiene que añadir o eliminar rutinas de inicialización. Este no es un problema importante, sin embargo. Si nos fijamos en la aplicación de la función, es la conversión de una llamada a la función en dos llamadas a función. Esta es la base de un delegado. Las funciones de la initializeToolkit1 y initializeToolkit2 no tienen nada que ver unos con otros, y cuando sea, cada uno se pudiera engañar fácilmente a pensar que es la única función asignada al proceso de carga. Un delegado no es como un proxy, en la que un delegado de todas las llamadas funciones, mientras que un proxy se llama a una función y luego esperar que la función llamada para llamar a otras funciones. Desde una perspectiva de aplicación, un delegado tiene una aplicación muy similar a la de un proxy. La ejecución de JavaScript de un delegado se diferencia de un delegado tradicionales porque no hay una instancia de objeto único la gestión de todas las referencias. En un delegado de la aplicación clásica, llamando a la función window.onload llamará a una estructura de objeto delegado, que pide la referencia de las funciones administradas. En el caso del ejemplo, que significa llamar a la estructura del objeto delegado llama initializeToolkit1 y initializeToolkit2. En la aplicación delegado de JavaScript, las referencias window.onload delegado una función principal que contiene dos referencias función: func1 y func2. La función de delegado de los padres tanto llamadas func1 y func2. Cuando las funciones de delegado de los padres se encadenan, func1 (elegido a efectos de ilustración) hace referencia a una función a llamar (initializeToolkit1), y func2 (elegido de nuevo para fines de ilustración) las referencias a la delegación de los padres al lado de la cadena. En la delegación de los padres al lado, una referencia de las funciones de la función a llamar (initializeFunction2), y las referencias de otra función otra función de delegado de los padres. Para entender el problema de la serialización, tratando de imaginar serializar window.onload referencias utilizando: window.onload = function () (delegates.invoke (this, arguments);) var buffer = ops.serialize (window.onload); En el ejemplo, las referencias window.onload una función que llama al método delegates.invoke variable global, que se llaman a las funciones initializeToolkit1 y initializeToolkit2. Si queremos guardar el estado de la página HTML, vamos a serializar window.onload porque es un punto de referencia estándar. Sin embargo, window.onload serializar no serializa los delegados. Se serializa la referencia a los delegados, y por lo tanto cuando la página se vuelve a crear, la instancia de los delegados serán desaparecidos. Usted puede leer el párrafo anterior y creo que he perdido mi canicas, porque eso no es cómo se hace la serialización. Es posible aplicar la solución siguiente lugar: window.unload = function () (var buffer = ops.serialize (delegados);) ` En esta solución, la descarga de la función será llamada, y un flujo de datos que representa a los delegados serán generadas. Pero esta solución es correcta? Sostengo que la solución es delegar el problema de los delegados de la variable a otro lugar, y no es nada de problemas. Imaginemos, por ejemplo, que se serializa el estado de una página. Como iterar los elementos, que están generando las funciones asociadas. Por lo que serializar window.load y window.unload. La gran ventaja de este enfoque es que al codificar utilizando un prototipo basado en el lenguaje JavaScript, que es que no se preocupan por múltiples implementaciones compartiendo las mismas referencias. Utilizando un enfoque basado en el valor, puede copiar una función de un objeto a otro y no preocuparse por el problema mixin describe en el artículo 2-15. Ahora que usted está familiarizado con la teoría detrás de la aplicación delegado, echemos un vistazo a los detalles técnicos . Fuente: / website / root / scripts / Jaxson / Common.js delegado: function (ejemplo, funcIdentifier, newFunc) (var delegatePrototype = function () (var func1 = __replace1; func2 var = __replace2; func1.apply (este, argumentos); func2 . aplican (esto, argumentos);) origFunc var; if (! ejemplo [funcIdentifier]) (origFunc = function () ();) else (origFunc = ejemplo [funcIdentifier];) ejemplo [funcIdentifier] = Generics.expand (delegatePrototype , (__replace1: origFunc, __replace2: newFunc));), Fuente: / web / ROOT / artículos AJAX / JavaScript / exceptions.html window.onload = function () (window.onerror = function (msg, archivo, ubicación) (info ( "window.onerror1", "Mensaje (" + msg + ", ) de archivo ( "+ archivo +") la ubicación ( "+ Ubicación + ")");)) ops.delegate (window," onload ", function () (window.onerror = function (msg, archivo, ubicación) (info ( "window.onerror2", "Mensaje (" + msg + ") archivo (" + archivo + ") la ubicación (" + + ubicación ")");))); En el ejemplo, la función window.onload se le asigna una función. La siguiente línea de código fuente utiliza la llamada al método ops.delegate para convertir la función atribuida a un delegado. Así, cuando el evento window.onload se llama, las dos funciones son llamados, lo mismo que asignar window.onerror. Una consecuencia de el uso de delegados es que un programador puede utilizar los delegados, pero se olvidan de los recursos que asigna el uso de delegados son compartidos. Por lo tanto, un buen programador no cederá window.onerror, pero utilizará un delegado para asignar window.onerror. Al escribir código en un método o una llamada a la funcion debe ser compartida, puede utilizar los delegados, pero debe tener los siguientes elementos en mente : • Los delegados permiten a los programadores a compartir un método de devolución de llamada, pero no debe suponer que los recursos en su implementación del método son exclusivos. • Los delegados de resolver el problema cuando una llamada a un método único se puede utilizar para hacer llamadas a métodos múltiples. • Los delegados no pueden regresar porque los valores de múltiples métodos pueden devolver valores, por lo que los delegados siempre debe usar los bloques de código. Los bloques de código son inherentemente simple, múltiple, o no orientada a resultados. Uso de bloques de código no requiere que la infraestructura para hacer algo especial cuando los datos tiene que ser devuelto. • Los delegados pueden ser implementados utilizando de referencia o escribiendo un valor de pato, con la diferencia principal entre ellos es la capacidad de serializar. 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 "Aplicación de los delegados" 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: 331 users browsing the articles directory |
|
|