javascript monkeypatching

¿Por qué está mal visto modificar los prototipos de objetos JavaScript?



monkeypatching (4)

Como señaló bjornd, monkey-patching es un problema solo cuando hay varias bibliotecas involucradas. Por lo tanto, no es una buena práctica hacerlo si está escribiendo bibliotecas reutilizables. Sin embargo, sigue siendo la mejor técnica que existe para solucionar problemas de compatibilidad entre navegadores cuando se utilizan objetos de host en JavaScript.

Vea este enlace para un accidente real cuando prototype.js y json2.js se usan juntos.

Me he topado con algunos comentarios aquí y allá sobre cómo está mal visto modificar el prototipo de un objeto JavaScript. Personalmente no veo cómo podría ser un problema. Por ejemplo, ¿extender el objeto Array para tener mapas e incluir métodos o para crear métodos de fecha más sólidos?


El problema es que el prototipo puede ser modificado en varios lugares. Por ejemplo, una biblioteca agregará el método de mapa al prototipo de Array y su propio código agregará el mismo pero con otro propósito. Así que se romperá una implementación.



Sobre todo debido a las colisiones espacio de nombres. Sé que el marco de Prototype ha tenido muchos problemas para mantener sus nombres diferentes de los incluidos de forma nativa.

Hay dos métodos principales para proporcionar servicios públicos a las personas.

Prototipado

Añadiendo una función al prototipo de un objeto. MooTools y Prototype hacen esto.

Ventajas:

  1. Súper fácil acceso.

Desventajas:

  1. Puede usar una gran cantidad de memoria del sistema. Mientras que los navegadores modernos solo obtienen una instancia de la propiedad del constructor, algunos navegadores más antiguos almacenan una instancia separada de cada propiedad para cada instancia del constructor.
  2. No necesariamente siempre disponible.

Lo que quiero decir con "no disponible" es esto:

Imagina que tienes una NodeList de document.getElementsByTagName y quieres recorrerla. No puedes hacer ..

document.getElementsByTagName(''p'').map(function () { ... });

..porque es una lista de nodos, no una matriz. Lo anterior le dará un error similar a: Uncaught TypeError: [object NodeList] doesn''t have method ''map'' .

Debo tener en cuenta que hay formas muy simples de convertir NodeList y otros Objetos similares a Array en arreglos reales.

Recogiendo

Creando una nueva variable global y utilidades de acumulación de acciones en ella. JQuery y Dojo hacen esto.

Ventajas:

  1. Siempre allí.
  2. Bajo uso de memoria.

Desventajas:

  1. No se coloca tan bien.
  2. Puede sentirse incómodo de usar a veces.

Con este método todavía no puedes hacer ..

document.getElementsByTagName(''p'').map(function () { ... });

..pero usted podría hacer ..

jQuery.map(document.getElementsByTagName(''p''), function () { ... });

..pero como lo señaló Matt, en el uso habitual, haría lo anterior con ..

jQuery(''p'').map(function () { ... });

¿Cual es mejor?

En última instancia, depende de usted. Si está de acuerdo con el riesgo de sobrescritura / sobrescritura, le recomendaría encarecidamente la creación de prototipos. Es el estilo que prefiero y siento que los riesgos merecen los resultados. Si no estás tan seguro como yo, entonces coleccionar también es un buen estilo. Ambos tienen ventajas y desventajas, pero en general, producen el mismo resultado final.