No, los prototipos no son malos. Por el contrario, JavaScript es un lenguaje prototípico y los prototipos son la forma en que se supuesto para extender objetos.
La cita es contra extender Object.prototype
específicamente. No es "el prototipo de un objeto". Todo en JavaScript hereda de Object
, por lo que jugar con sus efectos de prototipo todo. Rompe for(var n in obj){
loops y es simplemente molesto.
Eso es lo único contra los prototipos: aparecen en los bucles for-in. Aparte de eso, son, de lejos, la mejor manera de extender objetos en JS.
cuanto a por qué - Adición de objetos en el constructor, dicen:
function myClass(){
this.someMethod = function(){ ... }
}
significa que tendrá una función separada para cada instancia de la clase. Hacerlo a través de un prototipo:
myClass.prototype.someMethod = function(){ ... }
significa que solo habrá una copia de esa función. Mucho más eficiente con la memoria y permite la edición en caliente del idioma. Digamos que desea editar String.prototype, por ejemplo:
String.prototype.trim = function(){ ... }
Si sólo añadió que al constructor de alguna manera, las cadenas existentes no tendrían el método .trim()
, por lo que el código: navigator.userAgent.trim()
no funcionarían ya era navigator.userAgent
definido antes de haber agregado su método trim()
.
Y ese artículo es solo que Tim es anal y paranoico. Ignóralo :) Mientras no olvides escribir new myClass()
en lugar de solo myClass()
, no tendrás ningún problema.
Ah, muchas gracias por la increíble explicación. Eso respondió muchas de mis preguntas. –
Eso fue w ¡Buena respuesta! – some
En su primer ejemplo utilizando myClass(), dijo que crea una nueva función para cada instancia. ¿Eso todavía se aplica si en lugar de usar this.someMethod, utilicé return {someMethod: function() {}} –