2011-06-03 18 views

Respuesta

17

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

+1

colisiones de espacio de nombres similares también ocurren con plugins jQuery (que son parches mono a jQuery en sí): http://stackoverflow.com/q/5740974/479863 –

+0

En ese sentido, creo que es culpa del desarrollador si deciden usar varias bibliotecas y no saben qué está pasando en su código ... pero eso responde mi pregunta, gracias. – colourandcode

+7

¿Espera que un desarrollador conozca todas las estructuras internas y las implementaciones de una biblioteca masiva como JQuery o DoJo? Dudo si implementarían algo antes de la próxima versión del framework y tendrían que comenzar de nuevo. El objetivo de las bibliotecas y los marcos es que solo necesita saber cómo usarlos. –

6

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 librerías reutilizables. Sin embargo, sigue siendo la mejor técnica para solucionar los problemas de compatibilidad entre navegadores al usar objetos de host en JavaScript.

Vea this link para un accidente real cuando prototype.js y json2.js se usan juntos.

10

Principalmente debido a las colisiones del espacio de nombres. Sé que el framework Prototype ha tenido muchos problemas para mantener sus nombres diferentes de los que se incluyen de forma nativa.

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

Prototipos

agregar una función al prototipo de un objeto. MooTools y Prototype hacen esto.

Ventajas:

  1. Super fácil acceso.

Desventajas:

  1. puede utilizar una gran cantidad de memoria del sistema. Mientras que los navegadores modernos simplemente 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 la siguiente:

Imagine que tiene un NodeList de document.getElementsByTagName y desea iterar a través de ellos. No se puede hacer ..

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

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

Debo notar que hay formas muy simples de convertir NodeList y otros objetos similares a Array en matrices reales.

Recolección

Creación de una nueva variable y valores mundial marca acumulando utilidades en él. jQuery y Dojo hacen esto.

Ventajas:

  1. siempre allí.
  2. Bajo consumo de memoria.

Desventajas:

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

Con este método todavía no se podía hacer ..

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

..pero que podría hacer ..

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

..pero como señala Matt, en la costumbre use, usted haría lo anterior con ..

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

Cual es mejor?

En última instancia, depende de usted. Si estás de acuerdo con el riesgo de que te sobreescriban/sobreescriban, te recomiendo encarecidamente crear prototipos. Es el estilo que prefiero y creo que los riesgos valen la pena. Si no estás tan seguro como yo, entonces coleccionar también es un buen estilo. Ambos tienen ventajas y desventajas, pero en general, generalmente producen el mismo resultado final.

+1

@tylerwashburn: * tiene que almacenar una instancia de la función/cadena/lo que sea en cada instancia. * ¿En serio? Afaik añadiendo algo al prototipo lo agrega * una vez * en el constructor. Las instancias obtienen posteriormente su información del prototipo de los constructores. – KooiInc

+0

Usted puede hacer '$ ('p'). Map (función() {...}' en lugar de cualquier ejemplo 'map' usted menciona. –

+0

@KooiInc No estoy completamente seguro de que sea cierto, pero tengo escuché que los navegadores más antiguos lo hacen. Actualizaré mi respuesta para notar que. – Kayla

Cuestiones relacionadas