2011-04-07 13 views
15

En Felix's Node.js Style Guide que dice:¿Los prototipos son malos en JavaScript?

No extienda los prototipos de cualquier objetos, especialmente los nativos. Hay es un lugar especial en el infierno esperando si no obedece esta regla.

This article también me hicieron cuestionar los usos de los prototipos. Si vas a agregar un método más adelante en el código, ¿por qué no simplemente lo agregas al constructor original?

Entonces, ¿cuándo es necesario ampliar el prototipo de un objeto?

Respuesta

33

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.

+0

Ah, muchas gracias por la increíble explicación. Eso respondió muchas de mis preguntas. –

+0

Eso fue w ¡Buena respuesta! – some

+0

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() {}} –

2

No extienda los prototipos de ningún objeto , especialmente los nativos.

Al extender objetos nativos, como por ejemplo una cadena que podría ser un problema porque los usuarios esperan algún comportamiento de ese objeto, pero obtienen resultados diferentes. Podrían tener dificultades para depurar esto ..

Cuestiones relacionadas