He encontrado algunos comentarios aquí y allá sobre cómo es malo modificar el prototipo de un objeto JavaScript. Personalmente no veo cómo podría ser un problema. Por ejemplo, extendiendo el objeto Array para tener mapas e incluir métodos o para crear métodos de fecha más robustos.¿Por qué no está bien modificar los prototipos del objeto JavaScript?
Respuesta
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á.
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.
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:
- Super fácil acceso.
Desventajas:
- 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.
- 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:
- siempre allí.
- Bajo consumo de memoria.
Desventajas:
- No colocado tan bien.
- 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.
@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
Usted puede hacer '$ ('p'). Map (función() {...}' en lugar de cualquier ejemplo 'map' usted menciona. –
@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
Hay un artículo excelente de Nicholas C. Zakas explicando por qué esta práctica no es algo que deba tenerse en cuenta de ningún programador durante un proyecto de equipo o cliente (tal vez puede hacer algunos ajustes con fines educativos, pero no uso general del proyecto).
Mantenible JavaScript: No modifique los objetos que no posee: https://www.nczonline.net/blog/2010/03/02/maintainable-javascript-dont-modify-objects-you-down-own/
- 1. ¿Qué son prototipos en JavaScript?
- 2. ¿Los prototipos son malos en JavaScript?
- 3. ¿Por qué se implementó JavaScript usando herencia de prototipos?
- 4. "La etiqueta del servidor no está bien formada." ¿Qué pasa?
- 5. JavaScript herencia funcional con prototipos
- 6. ¿Cuándo está bien usar Javascript y cuándo no?
- 7. Tratando de entender el punto de los prototipos en JavaScript
- 8. ¿Está bien poner JavaScript en vistas parciales?
- 9. En JavaScript, ¿la asignación encadenada está bien?
- 10. Prototipos en JavaScript
- 11. ¿Por qué getchar() no funciona bien?
- 12. ¿Está actualizando la propiedad del objeto javascript?
- 13. ¿Por qué está bien saltar al alcance de un objeto de tipo escalar sin un inicializador?
- 14. ¿Por qué se puede modificar el objeto final?
- 15. ¿Por qué GORM no está guardando mi objeto?
- 16. ¿Por qué el constructo con() no está incluido en C#, cuando está realmente bien en VB.NET?
- 17. ¿Está bien pasar DataReaders a los constructores?
- 18. ¿Qué significa que Javascript es un lenguaje basado en prototipos?
- 19. ¿Está bien omitir los niveles de encabezado?
- 20. ¿Por qué los prototipos de funciones incluyen nombres de parámetros cuando no son necesarios?
- 21. jQuery + parseInt() no está jugando muy bien
- 22. Modificar los atributos svg con javascript no tiene efecto
- 23. ¿Por qué este objeto JavaScript no sale del alcance después de $ (document) .ready?
- 24. Al comparar por igualdad, ¿está bien usar `==`?
- 25. ¿Por qué no puedo editar los valores en mi DataGridView, aunque no está configurado como ReadOnly?
- 26. T4MVC, ¿está desactualizado? ¿Sigue bien? Si no, ¿qué más usar?
- 27. ¿Por qué intellisense no funciona en mi objeto ko?
- 28. ¿Por qué JSON.stringify no serializa los valores del prototipo?
- 29. ¿Por qué recibo este error 'no puedo modificar hash congelado'?
- 30. Llamada de miembro virtual en el constructor: ¿por qué una está bien y la otra no?
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 –
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
¿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. –